使用APICloud开发物流仓储app的实践

简介: 本文包括项目前端思维导图、原型图(UI图)、项目前端app创建流程、功能点解析

 一、前端思维导图

1.png

 

二、项目原型图(UI图)

初版原型地址墨刀原型链接《外贸类》 ,涉及的页面大概有20+,有兴趣可以去招人做一下UI。

2.jpg

 

三、前端app项目创建

1、注册APICloud开发者账号(www.apicloud.com),进入控制台创建app,选择Native app。

3.jpg

 

2、下载调试工具自定义loader安装包

自定义loader是一个安卓或iOS的安装包,可以装到收集端,从而进行js开发,将代码同步到原生app里面来,从而进行快速的开发。

4.jpg

 

3APICloud Studio3拉取代码

APICloud Studio3是APICloud的开发工具,用来开发代码从而和手机端的app进行同步,我们也可以用来管理代码,可以同步到云端,可以安装git插件,可以安装断点调试等等,是一个全方位的工具。

点击项目,导出云端检出。

5.jpg

 

4、创建证书

一键创建安卓证书,这个小技巧可以用在别的安卓或者其他的证书开发,这样节省了,创建证书的时间,让我们拥有一个百年的安卓证书。

6.jpg

 

5、真机同步功能

该功能是第2步和第3步的集合,通过自定义loader和APICloud Studio3,将手机和电脑至于同一个WIFI下面,这样他们就在同一个波段下面了,通过IP地址和端号将两个连在一起,可以同步代码。(注意可能遇到问题,有些需要给app设备读取存储的权限)

7.jpg

 

6、项目开发使用框架

该项目是使用Vue Cli来开发,Vue Cli创建的单页面的项目,将APICloud里面的API的方法集成到Vue的框架里面,其中window.apiready = () => { createApp(App).use(router).use(Vant).mount('#app') }这样API的方法每个页面都可以使用,还有就是打开页面的openwin的方法,api.openWin({ name: "index",url: "./index",});这样将index路由的页面可以打开。通过页面引入let api = window.api;将APICloud所有的API的方法引入到页面当中。

8.png

 

四、App功能讲解

1、App的多语言开发

主要的思路是,将一个页面的所有元素进行多语言话,例如tip,对应着英文,对应着中文,对应着韩文,有三个文件,tip中文文件,tip中文文件,tip韩文文件,当我们选择中文时候,就是选择的tip的中文文件,所有对应的都是中文。如果我们选择韩文,就是对应的选择的韩文文件,所有对应的都是韩文。

请看码云的源码Chan/vue多语言例子。

中文

const cn = {
    selsct:{
    title:'请选择物流',
        con: ' 威海可达鸭中韩物流',
        han: 'one world 韩中物流'
    }
}
export default cn;

韩文

const han = {
    selsct:{
  title:'물류를 선택하십시오.',//这里的韩文也是请选择物流
        con: '중국에서 한국에 도착',//威海可达鸭中韩物流
        han: '한국에서 중국으로'//这里的韩文也是one world 韩中物流
    }}export default han;

image.gif

9.jpg

<template>
  <view>
    <view class="_select"> 请您选择语言 </view>
    <div class="_image1" @click="goindex('domestic')">
      <div class="_title">中文</div>
      <img src="@/assets/zhonghan.png" style="margin: 0 auto; width: 100%" />
    </div>
    <div class="_image1" @click="goindex('overseas')">
      <div class="_title">韩文</div>
      <img src="@/assets/hanzhong.png" style="margin: 0 auto; width: 100%" />
    </div>
  </view>
</template>
<script>
let api = window.api;
export default {
  data() {
    return {};
  },
  methods: {
    async goindex() {
      api.openWin({
        name: "index",
        url: "./index",
      });
    },
  },
};
</script>
<style>
._select {
  font-size: 24px;
  font-weight: 400;
  color: #333333;
  line-height: 100px;
}
._image1 {
  margin: 0px 27px;
  position: relative;
  margin-top: 27px;
}
._image1 img {
  height: 102px;
}
._title {
  position: absolute;
  height: 100%;
  line-height: 102px;
  text-align: center;
  left: 10%;
  top: 10%;
}
</style>

 

2、扫一扫功能

首先在APICloud的后台,将扫一扫模块添加到项目当中,然后添加好了插件后重新自定义loader,手机端重新安装。根据模块文档提供的方法来使用该模块,该模块可以在js代码里面调用。对于我们的项目,可以用来识别货物的订单号,可以用来识别置物架的号码。这样对于操作员来说很简单。

10.jpg

11.jpg


这个功能运用到,仓库出入库里面,当仓库入件包裹入库件扫码,货物架扫码。

12.jpg

//样式
<template>
  <view>
    <view class="tishi">扫一扫单号快速入库</view>
    <view class="content">
      <van-cell-group inset>
      <van-cell title="快递单号" titleStyle="font-size: 28rpx;font-weight: 600;color: #333333;"
          icon="https://qrcode.deui.cn/xing.png">
      <input type="text" v-model="danhao" placeholder="请扫一扫快递单号" slot="label"  />
      <image src="../../../static/images/saoyisao.png"  slot="value" class="saoyisao" @click="saoyisao()"  mode=""></image>
        </van-cell>
      </van-cell-group>
    </view>
    <view class="foot">
      <view class="bt" @click="tijiaoruku()">提交出库</view>
    </view>
  </view>
</template>
//主要方法
saoyisao(){
let _this =this;
var zyHmsScan = api.require('zyHmsScan');
var param = {
    //returnAll:true
};
zyHmsScan.openDefaultView(param,function(ret){
  //  alert(JSON.stringify(ret));
_this.danhao=ret.result
});
}

image.gif

3、卡片列表

卡片列表这个功能,通过横向等分,设置界面。首先这个页面通过各个ui的插件库很好的实现,如果自己写的话大概的思路是,等分,里面套用块状元素,设置padding和margin,这样可以快速的设置出来兼容性良好的css。

13.jpg

 

4.包裹预报

包裹预报这个页面比较难写

(1)涉及到星号和字的对齐---可以用postion absolut实现。

<van-cell-group>
        <van-cell title="中国快递单号"  titleStyle="font-size: 28rpx;font-weight: 600;color: #333333;"
          arrow-direction="right"  rightIconStyle="font-size:24rpx"
          icon="https://qrcode.deui.cn/xing.png">
          <view slot="value" ><input value="单号" /></view>
</van-cell>
</van-cell-group>

image.gif

(2)选择发货仓和快递公司,可以快速的选择快递公司和仓库

可以用APICloud自带的底步弹框实现,可参考官方文档:https://docs.apicloud.com/Client-API/api#50

select(){
let _this =this;
api.actionSheet({
    title: '请选择',
    buttons: ['威海仓', '青岛仓', '深圳仓']
}, function(ret, err) {
    var index = ret.buttonIndex;
_this.cang = canglists[index]
});
}

image.gif

(3)添加商品,我们可以vue的双向绑定,再加上数据的地址传递来实现。

14.jpg


5、入库包裹状态

包裹的入库主要是未入库、已入库、待出库、已出库的状态改变比较难写,这里一般用vue class的active绑定来实现,还有就是用css after伪类来实现,如果学习伪类比较少的可以关注一下这里的内容。

15.jpg

//该代码主要是用的vant的van-tabs
<van-tabs v-model:active="active">
  <van-tab title="标签 1">未入库 1</van-tab>
  <van-tab title="标签 2">已入库</van-tab> 
  <van-tab title="标签 3">未出库</van-tab>
 <van-tab title="标签 4">已出库</van-tab>
</van-tabs>
//用到的vant的list组件来构成的下拉刷新的
<van-list
  v-model:loading="loading"
  :finished="finished"
  finished-text="没有更多了"
  @load="onLoad"
>
  <van-cell v-for="item in list" :key="item" :title="item" />
</van-list>

image.gif 

6、我的地址

我的地址这个页面是很平常的列表页面,我们可以通过UI类插件来实现。就是这个背景的渐变色

background: linear-gradient(156deg, #C7EBFF 0%, #70ADFF 100%);有机会可以看一看。

16.jpg

<template>
  <div>
    <div class="tishi">1收件人姓名填写韩语英文且证件名字一致 2 若无通关序列号, 请用登录证号代替 3地址请使用韩语填写,精准到门牌号</div>
    <div class="content">
      <van-cell-group>
        <van-cell title="收件人" titleStyle="font-size: 28px;font-weight: 600;color: #333333;"
          arrow-direction="right" rightIconStyle="font-size:24px"
          icon="https://qrcode.deui.cn/xing.png">
          <input type="text" placeholder="请输入收件人姓名" slot="value" v-model="consignee" class="u-slot-value" />
          </van-cell>
        <van-cell title="通关号码/身份证" titleStyle="font-size: 28px;font-weight: 600;color: #333333;"
          arrow-direction="right" rightIconStyle="font-size:24px"
          icon="https://qrcode.deui.cn/xing.png">
          <input type="text" placeholder="请输入通关号码" slot="value" v-model="personalCustomsClearanceCode" class="u-slot-value" />
          </van-cell>
        <van-cell title="电话" titleStyle="font-size: 28px;font-weight: 600;color: #333333;"
          icon="https://qrcode.deui.cn/xing.png">
          <input type="text" placeholder="请输入电话" v-model="consigneeTel"  slot="value" class="u-slot-value" />
        </van-cell>
        <van-cell title="地址" titleStyle="font-size: 28px;font-weight: 600;color: #333333;"
          icon="https://qrcode.deui.cn/xing.png">
          <input type="text" placeholder="请输入地址" v-model="consigneeAddr" slot="value" class="u-slot-value" />
        </van-cell>
      </van-cell-group>
    </div>
    <div style="margin-top: 40px;background-color: #FFFFFF;">
      <van-cell-group>
        <van-cell title="设为默认地址" titleStyle="font-size: 28px;font-weight: 600;color: #333333;"
          icon="https://qrcode.deui.cn/xing.png">
          <van-switch   size="36" v-model="isDefault" @change="change" slot="value" class="u-slot-value"></u-switch>
        </van-cell>
      </van-cell-group>
    </div>
    <div class="foot">
      <div class="bt" @click="addadress()">添加地址</div>
    </div>
  </div>
</template>
<script>
  import common from "../../../common/common.js"
  import ajax from "../../../common/ajax.js"
  export default {
    data() {
      return {
        cang: "威海仓",
        value:true,
        consignee:"",//姓名
        personalCustomsClearanceCode:"",
        consigneeTel:"",
        consigneeAddr:"",
        isDefault:false
      }
    },
    methods: {
      change(){
        console.log(this.value)
      },
      async addadress(){
        if(!this.consignee){
          alert('请您输入用户名')
          return false
        }
        if(!this.personalCustomsClearanceCode){
          alert('请您输入通关号')
          return false
        }
        if(!this.consigneeTel){
          alert('请您输入电话')
          return false
        }
        if(!this.consigneeAddr){
          alert('请您输入地址')
          return false
        }
        let data ={
          wxOpenId:common.fu.getStorageSync("openid"),
          consignee:this.consignee,
          personalCustomsClearanceCode:this.personalCustomsClearanceCode,
          consigneeTel:this.consigneeTel,
          consigneeAddr:this.consigneeAddr,
          isDefault:this.isDefault==true?'Y':'N'
        }
        console.log(data)
        let direction =  common.fu.getStorageSync("direction")
        if(direction=="domestic"){
          let datas = await ajax.fu('POST','business/BizConsigneeAddressDomestic',data);
          this.assignment(datas)
        }else{
          let datas = await ajax.fu('POST','business/BizConsigneeAddressOverseas',data);
          this.assignment(datas)
        }
      },
      assignment(datas){
        if(datas.code==200){
          alert('添加成功')
        }
      }
    }
  }
</script>
<style lang="scss" scoped>
  .zhuce{
    position: absolute;
    right: -28px;
    top: -1px;
    width: 24px;
    height: 24px;
    background-color: #FFF0E1;
    color: #FE5252;
    font-size: 00px;
    text-align: center;
    border-radius: 50%;
    line-height: 24px;
  }
  .jian1 {
    position: absolute;
    right: -56px;
    top: -4px;
    width: 24px;
    height: 24px;
    background-color: #FFF0E1;
    color: #FE5252;
    font-size: 10px;
    text-align: center;
    border-radius: 50%;
    line-height: 24px;
  }
  .jian {
    position: absolute;
    right: -30px;
    top: -1px;
    width: 24px;
    height: 24px;
    background-color: #FFF0E1;
    color: #FE5252;
    font-size: 10px;
    text-align: center;
    border-radius: 50%;
    line-height: 24px;
  }
  .foot {
    margin: 0px 16px;
    .foot_title {
      line-height: 44px;
    }
    .bt {
      height: 44px;
      line-height: 44px;
      text-align: center;
      color: #FFFFFF;
      font-size: 17px;
      background-color: #0365FC;
      border-radius: 4px;
      position: fixed;
      left: 10px;
      bottom: 10px;
      right: 10px;
    }
  }
  .content {
    // padding: 0px 32px;
    background-color: #FFFFFF;
  }
  .content1 {
    margin: 17px 16px;
  }
  .u-slot-value {
    text-align: right;
    color: red;
    position: relative;
  }
  .tishi {
    font-size: 12px;
    line-height: 23px;
    height: 45px;
    text-align: center;
    padding: 0 10px;
    background: linear-gradient(156deg, #C7EBFF 0%, #70ADFF 100%);
  }
</style>

image.gif

7、云修复

首先在APICloud Studio3 这边的xml文件修改文件,设置开启云修复开启,然后提交到打包的后台。注意一定到提交到打包的后台, 否则会不生效。然后我们正常的包,发版。如果遇到有的页面修改的问题,将修改后的文件上传到APICloud的云修复的后台,然后同步的下发下去,就可以改变原来的我们发的版本下的页面,从而实现云修复。


17.png

18.png

 

8、闪屏广告端设置

启用定制广告页注意:启用该功能后,应用的启动页将动态显示为您在此提交的图片。关闭该功能时,应用默认显示“端设置”中设置的启动页。

19.jpg

 

9、云编译

登录自己的APICloud账号,在对应的应用(测试)下,进行云编译刚提交的代码,云编译完成后会出现APP下载的二维码,手机扫描下载后安装即可。从云编译的地方编译正式版的安卓或者苹果iOS软件。

20.jpg

21.png

目录
相关文章
|
5天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
9天前
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
9天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
1月前
|
Web App开发 Java 视频直播
FFmpeg开发笔记(四十九)助您在毕业设计中脱颖而出的几个流行APP
对于软件、计算机等专业的毕业生,毕业设计需实现实用软件或APP。新颖的设计应结合最新技术,如5G时代的音视频技术。示例包括: 1. **短视频分享APP**: 集成FFmpeg实现视频剪辑功能,如添加字幕、转场特效等。 2. **电商购物APP**: 具备直播带货功能,使用RTMP/SRT协议支持流畅直播体验。 3. **同城生活APP**: 引入WebRTC技术实现可信的视频通话功能。这些应用不仅实用,还能展示开发者紧跟技术潮流的能力。
69 4
FFmpeg开发笔记(四十九)助您在毕业设计中脱颖而出的几个流行APP
|
28天前
|
移动开发 小程序 JavaScript
uni-app开发微信小程序
本文详细介绍如何使用 uni-app 开发微信小程序,涵盖需求分析、架构思路及实施方案。主要功能包括用户登录、商品列表展示、商品详情、购物车及订单管理。技术栈采用 uni-app、uView UI 和 RESTful API。文章通过具体示例代码展示了从初始化项目、配置全局样式到实现各页面组件及 API 接口的全过程,并提供了完整的文件结构和配置文件示例。此外,还介绍了微信授权登录及后端接口模拟方法,确保项目的稳定性和安全性。通过本教程,读者可快速掌握使用 uni-app 开发微信小程序的方法。
57 3
|
2月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
78 0
|
2月前
|
Java 程序员 Android开发
探索安卓开发:构建你的第一个App
【8月更文挑战第27天】在数字化时代的浪潮中,移动应用成为人们生活不可或缺的一部分。对于渴望进入软件开发领域的新手而言,掌握如何构建一款简单的安卓App是开启技术之旅的关键一步。本文旨在通过浅显易懂的语言和步骤分解,引导初学者了解安卓开发的基础知识,并跟随示例代码,一步步实现自己的第一个安卓App。从环境搭建到界面设计,再到功能实现,我们将一同揭开编程的神秘面纱,让每个人都能体会到创造软件的乐趣。
|
2月前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
43 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
2月前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
68 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
2月前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
56 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
下一篇
无影云桌面