sl-express/01-讲义/md/day13_14 项目分组实战.md

16 KiB
Raw Blame History

1、背景说明

通过前面课程的学习,我们已经掌握了神领物流项目相关业务的开发,也参与了核心调度中心的开发,对于项目有了更深的理解,在此阶段中,我们将基于神领物流项目本身的基础之上扩展新的功能,这些新的功能将由你来完成。加油~ w.gif

2、功能需求

项目分组实战,目标是完成三个需求,实现三个微服务,分别是

  • 取派件任务搜索微服务 (★★★★☆)
  • 车辆轨迹微服务 (★★★☆☆)
  • 短信微服务 (★★☆☆☆)
    • 快递员派件时,下发短信通知收件人
    • 快递员取件后用户超时1小时未付款下发短信通知付款
    • 收件人签收后,下发短信邀请为快递员评价
    • ……

2.1、取派件任务搜索

取派件任务搜索是在快递员端的操作,主要包含两个功能,分别是【任务搜索】和【最近搜索】,其中【最近搜索】已经在sl-express-ms-web-courier中实现,所以在实战中,只需要实现【任务搜索】即可。 任务搜索的需求如下:(仔细阅读需求) image.png 功能界面: image.png

2.2、车辆轨迹

车辆轨迹首先是在创建运单后会对整个运输路线进行规划借助高德地图服务规划完成后轨迹点数据存于MongoDB用于展现轨迹。具体需求可参考需求文档 车辆在运输中、快递员在派件中会上报位置自己的位置具体由各自的APP进行上报用于展现当前车辆所在的位置。 功能效果图如下: image.png image.png

3、实现分析

3.1、取派件任务搜索

关于搜索的实现的,可以参考文档:https://sl-express.itheima.net/#/zh-cn/modules/sl-express-ms-search

3.1.1、业务流程

由上面的业务流程可以看出:

  • 快递员的取派件任务都是通过work微服务发出消息与Elasticsearch中的数据同步的
  • 快递员端微服务通过搜索微服务的查询,可以查询到符合条件的数据

3.1.2、基础代码

在git中提供搜索微服务的基础代码仅供实战参考。学生可自行设计代码不要求必须一样能够实现业务功能即可

工程名 git地址
sl-express-ms-search-api http://git.sl-express.com/sl/sl-express-ms-search-api.git
sl-express-ms-search-domain http://git.sl-express.com/sl/sl-express-ms-search-domain.git
sl-express-ms-search-service http://git.sl-express.com/sl/sl-express-ms-search-service.git

3.1.3、实现提示

3.1.3.1、新版Java API学习

ElasticSearch自7.15版本以后,废弃了 RestHighLevelClient ,官方推荐使用 ElasticsearchClient ,该客户端的使用示例均已做了测试用例。 如下图中IndexTest 是索引相关测试用例DocumentTest 是文档相关测试用例ComplexSearchTest 是复杂搜索相关测试用例。 另外,同学们也可参考官方文档进行自主学习:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/searching.html image.png

3.1.3.2、分词器学习

搜索微服务中我们对于运单号、手机号、姓名字段进行搜索。运单号和手机号字段使用Ngram分词器姓名字段先使用Ngram分词器再使用拼音分词器。 以上两种分词器可参考官方文档进行自主学习:

3.1.3.3、索引库结构

在kibana中创建索引库和映射仅供参考可自行调整

PUT courier_task
{
  "settings": {
    "index.max_ngram_diff":12,// ngram分词器设置最大最小步长间隔
    "analysis": {
      "analyzer": {// 自定义分词器
        "code_analyzer": {// 编码类分词器,适用于手机号和运单号
          "tokenizer": "code_tokenizer"
        },
        "name_analyzer":{// 姓名分词器
          "tokenizer": "name_tokenizer",
          "filter": "py" // 分词后再用拼音分词器过滤
        }
      },
      "tokenizer": {
        "code_tokenizer": {
          "type": "ngram",
          "min_gram": 4,
          "max_gram": 15,
          "token_chars": [
            "letter",
            "digit"
          ]
        },
        "name_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      },
      "filter": {// 自定义tokenizer filter
        "py":{// 过滤器名称
          "type": "pinyin",// 过滤器类型这个自定义的过滤器使用的是pinyin分词器
          "keep_full_pinyin": false,//不要把单个字ch
          "keep_joined_full_pinyin": true,//把词语转成全拼
          "keep_original": true,//转完之后的中文保留
          "limit_first_letter_length": 16,//转成的拼音首字母不能超过16个
          "remove_duplicated_term": true,//转成的拼音不能有重复的,重复的删掉
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "actualEndTime" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "actualStartTime" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "address" : {
        "type" : "text"
      },
      "agencyId" : {
        "type" : "long"
      },
      "courierId" : {
        "type" : "long"
      },
      "created" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "estimatedEndTime" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "estimatedStartTime" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "id" : {
        "type" : "keyword"
      },
      "isDeleted" : {
        "type" : "keyword"
      },
      "name" : {
        "type" : "text",
        "analyzer": "name_analyzer",
        "search_analyzer": "keyword"
      },
      "orderId" : {
        "type" : "long"
      },
      "phone" : {
        "type" : "text",
        "analyzer": "code_analyzer",
        "search_analyzer": "keyword"
      },
      "status" : {
        "type" : "keyword"
      },
      "taskType" : {
        "type" : "keyword"
      },
      "transportOrderId" : {
        "type" : "text",
        "analyzer": "code_analyzer",
        "search_analyzer": "keyword"
      },
      "updated" : {
        "type" : "date",
        "format" : "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

3.2、车辆轨迹

3.2.1、业务流程

### 3.2.2、基础代码 在git中提供车辆轨迹微服务的基础代码仅供实战参考。学生可自行设计代码不要求必须一样能够实现业务功能即可

工程名 git地址
sl-express-ms-track-api http://git.sl-express.com/sl/sl-express-ms-track-api.git
sl-express-ms-track-domain http://git.sl-express.com/sl/sl-express-ms-track-domain.git
sl-express-ms-track-service http://git.sl-express.com/sl/sl-express-ms-track-service.git

3.2.3、实现提示

实现思路:

  • 根据收发件人的地址通过高德地图查询路线数据,需要将转运节点作为途经点
  • 解析高德返回的数据存储到MongoDB中解析有一定难度

3.3、短信微服务

项目中需要搭建短信微服务,需要发送短信进行通知,在这里主要实现的业务是,运单开始派送时发送短信通知收件人。 基础代码,仅供实战参考。(学生可自行设计代码,不要求必须一样,能够实现业务功能即可)

工程名 git地址
sl-express-ms-sms-domain http://git.sl-express.com/sl/sl-express-ms-sms-domain.git
sl-express-ms-sms-api http://git.sl-express.com/sl/sl-express-ms-sms-api.git
sl-express-ms-sms-service http://git.sl-express.com/sl/sl-express-ms-sms-service.git

关于短信发送渠道,自行选择,不做强制要求。建议选择阿里云平台。

4、项目分组

4.1、时间安排

此次项目实战安排2天课时可以加一天自习调整为3天具体的时间安排如下

  • 第一天上午,由讲师带领学生了解项目实战中的内容
  • 第一天的下午,第二天,第三天上午,这些时间段是学生实战开发的时间
  • 第三天下午,成果演示

4.2、分组安排

  • 将一个班的学生分成若干小组每个小组成员5~6人最多不超过8人。
  • 每个小组选取一名组长,组长负责组员的任务分工。
  • 每个组员都要参与开发,不得以任何接口拒绝组长安排的任务。
  • 每个小组都需要完成实战中的三个功能(搜索、车辆轨迹、短信)的开发。

4.3、代码管理

在项目开发的过程中我们都是基于虚拟机中的git提交代码的在分组实战中需要将代码共享同组人员公共修改代码此时虚拟机中的git就无法满足需求了在这里可以借助码云来完成共享。基本的架构如下: 说明:

  • 组长在码云中创建相应的项目,并且邀请组员成为开发者
  • 组长将本地虚拟机环境中的git代码提交到码云只需要提交实战中涉及到工程即可
  • 组员代码拉取到本地,即可进行项目开发,在开发完成后将代码提交到码云
  • 待所有的功能开发完成后组长将代码同步到本地虚拟机中的git中最终基于组长的环境进行功能演示
  • 同样组员也将最终的代码同步到自己的本地环境中提交到虚拟机中的git服务中
  • 最终,所有人的本地虚拟机中的代码都应该是一致的

5、成果演示

  • 每个组都需要准备一个演示ppt在成果演示阶段使用ppt风格不限
  • 演示时,不仅是通过接口演示功能,还要通过四端进行演示,能够将完整的物流流程走通
  • 如果有额外实现一些相关的功能,会有加分