开发教程|如何使用APICloud AVM框架开发一个移动应用?

简介: AVM框架拥有趋近于原生的编程体验,经过一年多的发展,已成为国内主流的多端开发框架之一。本文将梳理一位开发者的投稿,详细介绍如何使用APICloud的AVM框架开发一款应用。

AVM框架拥有趋近于原生的编程体验,经过一年多的发展,已成为国内主流的多端开发框架之一。本文将梳理一位开发者的投稿,详细介绍如何使用APICloud的AVM框架开发一款应用。

以开发一款“预约”功能为主的应用为例,本文将从应用结构、应用原型、应用前端开发和应用后台搭建四个方面详细展开,介绍应用的开发过程。

01 梳理应用结构
首先,需要先梳理“预约”应用的结构和核心功能,通过思维导图画出应用的基本结构。

02 画出应用原型
根据应用结构,进一步细化应用各个页面的功能展示,使用码前原型工具画出“预约”应用的原型。

原型链接可点击此处查看。

03 应用前端开发
“预约”应用前端采用APICloud AVM多端开发框架进行开发,包括 swiper 轮播图、网络请求封装等多个要点。使用 APICloud 多端技术进行开发,可以实现一套代码多端运行,支持编译成 Android & iOS app 以及微信小程序。

01

APICloud使用步骤

(1)下载 APICloud Studio 3 作为开发工具。下载地址:点击此处下载。

(2)注册账号后在控制台创建app,控制台地址: 点击此处查看。

(3)设置证书,一键创建安卓证书。

(4)APICloud Studio3 拉取代码,点击项目,导出云端检出

检出

检出后工作目录

(5)修改或者提交项目源码,并为当前项目云编译自定义 Loader 进行真机同步调试预览。

使用 AppLoader 进行真机同步调试预览,后台自动以Loader下载到手机端,安装后,点击小圆圈,输入IP地址:192.168.2.152 端口:10916,连接后真机同步,可以看到刚创建后的结果。

02

AVM框架的使用

AVM的主要优势如下:

易用:有 Vue、React 基础,可快速上手,配套专用的开发工具APICloud Studio3。

多端:一次开发,多端渲染,一个技术栈搞定移动端开发。

功能 API 丰富:提供 1k+ 模块和 2w+ API 可直接调用,面向行业和场景无限制。

(1)UI

官方文档:点击此处查看

很多UI都是自己设计,也可参考开发者流浪男做的AUI框架。字体图标用的阿里字体图标。

APICloud官网组装了一套vant的组件,可点击此处查看。

(2)ajax网络交互

使用下方代码实现。

// 表单方式提交数据或文件

api.ajax({

url: 'http://192.168.1.101:3101/upLoad',

method: 'post',

data: {

values: {

name: 'haha'

},

files: {

file: 'fs://a.gif'

}

}

}, function(ret, err) {

if (ret) {

api.alert({ msg: JSON.stringify(ret) });

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

// 提交JSON数据

api.ajax({

url: 'http://192.168.1.101:3101/upLoad',

method: 'post',

headers: {

'Content-Type': 'application/json;charset=utf-8'

},

data: {

body: {

name: 'haha'

}

}

}, function(ret, err) {

if (ret) {

api.alert({ msg: JSON.stringify(ret) });

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

(3)vue指令使用(v-for v-show v-if v-else v-for v-on v-bind v-model等)

1.数据绑定

使用 Mustache 语法:

使用v-bind指令:

2.事件绑定

Click me!

export default {

name: 'test',

methods: {

doThis(msg){

api.alert({

msg: msg

});

}

}

}

(4)注册、登录

1.注册接口链接:点击此处查看。

注册代码

注册

登录

export default {

name: "tpl",

apiready() {

api.setStatusBarStyle({

style: "light",

color: "-"

});

},

data() {

return {

zhanghao: '',

password: '',

src: "https://baodinglingqian.oss-cn-beijing.aliyuncs.com/bg.png"

};

},

computed: {

},

methods: {

handleClick(e) {

api.openWin({

name: 'main',

url: './main.stml',

pageParam: {

name: 'test'

}

});

},

reg() {

var _this = this;

// 提交JSON数据

api.ajax({

url: 'http://yy.deui.cn/api.php/index/re',

method: 'get',

// headers: {

// 'Content-Type': 'application/json;charset=utf-8'

// },

data: {

body: {

username: _this.zhanghao,

password: _this.password

}

}

}, function (ret, err) {

console.log(JSON.stringify(ret))

if (ret.msg == '返回成功') {

api.toast({

msg: '注册成功',

location: "middle"

});

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

}

}

};

.denglu {

margin-top: 10px;

font-size: 14px;

}

.touxiang {

margin-top: 10%;

width: 150px;

height: 150px;

border-radius: 100px;

margin: 0 auto;

}

html {

width: 100%;

height: 100%;

}

body {

width: 100%;

height: 100%;

}

.originImage {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 1;

}

.page {

/ position:fixed; /

position: relative;

z-index: 9;

width: 100%;

height: 100%;

}

.page1 {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 2;

}

input {

padding-left: 10px;

line-height: 35px;

height: 35px;

border-radius: 5px;

}

.zhanghao {

display: block;

margin: 0 auto;

margin-top: 15%;

margin-bottom: 15px;

height: 60px;

}

.mima {

display: block;

margin: 0 auto;

margin-top: 25px;

}

.zhuce {

width: 100%;

height: 35px;

line-height: 35px;

background-color: coral;

text-align: center;

color: #fff;

margin-top: 25px;

}

.page {

height: 100%;

background-color: white;

}

.header {

background: #81a9c3;

justify-content: center;

align-items: center;

}

.header__title {

color: #fff;

font-size: 18px;

font-weight: bold;

height: 50px;

line-height: 50px;

}

.main {

flex: 1;

padding: 15px;

}

.h1 {

font-size: 24px;

}

.item {

flex-direction: row;

padding: 10px 0;

}

.item__text {

color: #333;

white-space: nowrap;

}

.item__value {

margin-left: 5px;

}

.footer {

background: #81a9c3;

flex-direction: row;

justify-content: center;

align-items: center;

}

.footer__text {

color: #fff;

font-size: 14px;

height: 30px;

line-height: 30px;

}

2.登录接口链接:点击此处查看。

登录代码

登录

注册

export default {

name: "tpl",

apiready() {

api.setStatusBarStyle({

style: "light",

color: "-"

});

var value = localStorage.getItem('uid');

api.openWin({

name: 'home',

url: './home.stml'

});

},

data() {

return {

zhanghao: '',

password: '',

src: "https://baodinglingqian.oss-cn-beijing.aliyuncs.com/bg.png"

};

},

computed: {

},

methods: {

handleClick(e) {

api.openWin({

name: 'region',

url: './region.stml',

pageParam: {

name: 'test'

}

});

// api.toast({

// msg: this.data.text,

// location: "middle"

// });

},

login() {

var _this = this;

api.ajax({

url: 'http://yy.deui.cn/api.php/index/login',

method: 'get',

// headers: {

// 'Content-Type': 'application/json;charset=utf-8'

// },

data: {

body: {

username: _this.zhanghao,

password: _this.password

}

}

}, function (ret, err) {

console.log(JSON.stringify(ret))

localStorage.setItem('uid', ret.data.data0);

if (ret.msg == '返回成功') {

api.toast({

msg: '登录成功',

location: "middle"

});

api.openWin({

name: 'home',

url: './home.stml'

});

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

}

}

};

.denglu {

margin-top: 10px;

font-size: 14px;

}

.touxiang {

margin-top: 10%;

width: 150px;

height: 150px;

border-radius: 100px;

margin: 0 auto;

}

html {

width: 100%;

height: 100%;

}

body {

width: 100%;

height: 100%;

}

.originImage {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 1;

}

.page {

/ position:fixed; /

position: relative;

z-index: 9;

width: 100%;

height: 100%;

}

.page1 {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 2;

}

input {

padding-left: 10px;

line-height: 35px;

height: 35px;

border-radius: 5px;

}

.zhanghao {

display: block;

margin: 0 auto;

margin-top: 15%;

margin-bottom: 15px;

height: 60px;

}

.mima {

display: block;

margin: 0 auto;

margin-top: 25px;

}

.zhuce {

width: 100%;

height: 35px;

line-height: 35px;

background-color: coral;

text-align: center;

color: #fff;

margin-top: 25px;

}

.page {

height: 100%;

background-color: white;

}

.header {

background: #81a9c3;

justify-content: center;

align-items: center;

}

.header__title {

color: #fff;

font-size: 18px;

font-weight: bold;

height: 50px;

line-height: 50px;

}

.main {

flex: 1;

padding: 15px;

}

.h1 {

font-size: 24px;

}

.item {

flex-direction: row;

padding: 10px 0;

}

.item__text {

color: #333;

white-space: nowrap;

}

.item__value {

margin-left: 5px;

}

.footer {

background: #81a9c3;

flex-direction: row;

justify-content: center;

align-items: center;

}

.footer__text {

color: #fff;

font-size: 14px;

height: 30px;

line-height: 30px;

}

(5)首页轮播图

轮播图链接:点击此处查看。

首页

import ACellGroup from "../../components/act/a-cell-group";

import ACell from "../../components/act/a-cell";

export default {

name: 'test',

data() {

return {

shangjialist: [],

bannerlist: [],

current: 0,

src: "https://baodinglingqian.oss-cn-beijing.aliyuncs.com/bg.png"

}

},

methods: {

apiready() {

this.banner()

this.allstores()

// var customSwiper = document.getElementById('customSwiper');

// customSwiper.load({

// data: this.data.dataList

// });

},

onchange(e) {

this.data.current = e.detail.current;

},

godetial(item) {

console.log(JSON.stringify(item))

api.openWin({

name: 'detial',

url: './detial.stml',

pageParam: {

id: item.id

}

});

},

banner() {

var _this = this;

api.ajax({

url: 'http://yy.deui.cn/api.php/index/banner',

method: 'get',

}, function (ret, err) {

if (ret.msg == '返回成功') {

_this.data.bannerlist = ret.data.data

// var customSwiper = document.getElementById('customSwiper');

// customSwiper.load({

// data: _this.data.bannerlist

// });

// console.log(JSON.stringify(_this.bannerlist))

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

},

allstores() {

var _this = this;

api.ajax({

url: 'http://yy.deui.cn/api.php/index/stores',

method: 'get',

}, function (ret, err) {

if (ret.msg == '返回成功') {

console.log(1)

console.log(JSON.stringify(ret.data.data))

console.log(1)

var obj = ret.data.data

for (let index = 0; index < obj.length; index++) {

const element = obj[index];

element['content'] = element['content'].substring(0, 9) + '...'

}

console.log(JSON.stringify(obj))

_this.data.shangjialist = obj

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

}

}

}

.denglu {

margin-top: 10px;

font-size: 14px;

}

.touxiang {

margin-top: 10%;

width: 150px;

height: 150px;

border-radius: 100px;

margin: 0 auto;

}

html {

width: 100%;

height: 100%;

}

body {

width: 100%;

height: 100%;

}

.originImage {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 1;

}

.page {

/ position:fixed; /

position: relative;

z-index: 9;

width: 100%;

height: 100%;

}

.page1 {

position: absolute;

top: 0px;

left: 0px;

right: 0px;

bottom: 0px;

z-index: 2;

}

input {

padding-left: 10px;

line-height: 35px;

height: 35px;

border-radius: 5px;

}

.zhanghao {

display: block;

margin: 0 auto;

margin-top: 15%;

margin-bottom: 15px;

height: 60px;

}

.mima {

display: block;

margin: 0 auto;

margin-top: 25px;

}

.zhuce {

width: 100%;

height: 35px;

line-height: 35px;

background-color: coral;

text-align: center;

color: #fff;

margin-top: 25px;

}

.page {

height: 100%;

background-color: white;

}

.header {

background: #81a9c3;

justify-content: center;

align-items: center;

}

.header__title {

color: #fff;

font-size: 18px;

font-weight: bold;

height: 50px;

line-height: 50px;

}

.main {

flex: 1;

padding: 0px;

}

.h1 {

font-size: 24px;

}

.item {

flex-direction: row;

padding: 10px 0;

}

.item__text {

color: #333;

white-space: nowrap;

}

.item__value {

margin-left: 5px;

}

.footer {

background: #81a9c3;

flex-direction: row;

justify-content: center;

align-items: center;

}

.footer__text {

color: #fff;

font-size: 14px;

height: 30px;

line-height: 30px;

}

.main {

width: 100%;

height: 100%;

}

.swiper {

width: 100%;

height: 190px;

/ background-color: blue; /

}

.swiper-item {

justify-content: center;

}

.title {

padding: 10px 0;

font-size: 20px;

}

.desc {

width: 100%;

text-align: center;

}

.container {

width: 100%;

height: 200px;

}

.indicator {

flex-direction: row;

justify-content: center;

position: absolute;

width: 100%;

height: 20px;

bottom: 8px;

}

.indicator-item {

width: 15px;

height: 8px;

margin: 3px;

}

.indicator-item-normal {

background-color: #ddd;

}

.indicator-item-active {

background-color: red;

}

(6)首页列表

所有店铺链接:点击此处查看。

shangjialist: [],

allstores() {

var _this = this;

api.ajax({

url: 'http://yy.deui.cn/api.php/index/stores',

method: 'get',

}, function (ret, err) {

if (ret.msg == '返回成功') {

console.log(1)

console.log(JSON.stringify(ret.data.data))

console.log(1)

var obj = ret.data.data

for (let index = 0; index < obj.length; index++) {

const element = obj[index];

element['content'] = element['content'].substring(0, 9) + '...'

}

console.log(JSON.stringify(obj))

_this.data.shangjialist = obj

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

}

(7)页面传参获取详情

api.openWin({

name: 'detial',

url: './detial.stml',

pageParam: {

id: 123

}

});

apiready() {//like created

if (api.pageParam.id) {

this.data.id = api.pageParam.id

}

console.log(this.data.id)

}

店铺详情:点击此处查看。

<a-nav-bar v-bind:title="title" left-text="返回" left-arrow @click-left="onClickLeft"

@click-right="onClickRight" />

<!--

-->

产品

import ACellGroup from "../../components/act/a-cell-group";

import ACell from "../../components/act/a-cell";

import ANavBar from "../../components/act/a-nav-bar";

import AButton from "../../components/act/a-button";

export default {

name: 'detial',

apiready() {//like created

if (api.pageParam.id) {

this.data.id = api.pageParam.id

}

console.log(this.data.id)

this.init()

},

data() {

return {

title: "详情",

id: 1,

store: {},

product:[]

}

},

methods: {

init() {

var _this = this;

api.ajax({

url: 'http://yy.deui.cn/api.php/index/searchstore',

method: 'get',

data: {

body: {

id: _this.data.id

}

}

}, function (ret, err) {

if (ret.msg == '返回成功') {

console.log(1)

console.log(JSON.stringify(ret.data.product))

console.log(1)

_this.data.store = ret.data.data[0]

_this.data.product = ret.data.product

} else {

api.alert({ msg: JSON.stringify(err) });

}

});

},

yuyuproduct(_item){

console.log(JSON.stringify(_item))

},

onClickLeft() {

api.closeWin();

},

onClickRight() {

}

}

}

.page {

height: 100%;

}

(8)导航栏组件

import ANavBar from "../../components/act/a-nav-bar";

<a-nav-bar v-bind:title="title" left-text="返回" left-arrow @click-left="onClickLeft"

@click-right="onClickRight" />

注意:导航栏组件的使用,文档中的引用

import ACell from"../../components/act/a-nav-bar.stml";

使用中建议去掉stml后缀,import ACell from"../../components/act/a-nav-bar";

(9)localStorage 对象使用

main.stml里面的这个,就是用的这个对象

localStorage.setItem('uid', ret.data.data0);

下面是localStorage的用法

// 设置存储.

sessionStorage.setItem('key', 'value');

// 获取存储.

var value = sessionStorage.getItem('key');

// 移除存储

sessionStorage.removeItem('key');

// 清除所有存储项

sessionStorage.clear();

// 获取已有存储项数

var length = sessionStorage.length;

// 根据存储项索引获取存储键名

var keyName = sessionStorage.key(index);

(10)APICloud组件、模块的使用

"模块"中添加模块,如果是H5的需要下载后,放到自己的代码中;如果是原生的模块,需要添加到自己应用中,去require去使用。网上有专门介绍这块的教程,不清楚的可以去搜搜。

04 应用后台搭建
“预约”应用的后台是用tp5框架写的php后台。

tp5下的fastadmin框架,可以根据fastadmin一键生成简单后台,数据库文件为:

后台接口代码

<?php

namespace app\api\controller;

use app\common\controller\Api;

use think\Db;

/**

  • 首页接口

*/

class Index extends Api

{

protected $noNeedLogin = ['*'];

protected $noNeedRight = ['*'];

/**

  • 首页

*/

public function index()

{

$this->success('请求成功');

}

//注册

public function re(){

$username = $this->request->request("username");

$password = md5($this->request->request("password"));

$sql = " INSERT INTO yuyuuser (id, group_id, username, nickname, password, salt, email, mobile, avatar, level, gender, birthday, bio, money, score, successions, maxsuccessions, prevtime, logintime, loginip, loginfailure, joinip, jointime, createtime, updatetime, token, status, verification) VALUES (NULL, '0', '', '".$username ."', '".$password."', '', '', '', '', '0', '0', NULL, '', '0.00', '0', '1', '1', NULL, NULL, '', '0', '', NULL, NULL, NULL, '', '', '')";

$rst = Db::query($sql);

$data =1;

$this->success('返回成功', ['data' => $data]);

}

//登录

public function login(){

$username = $this->request->request("username");

$password = md5($this->request->request("password"));

$sql = "SELECT nickname,id FROM yuyuuser where nickname='".$username."' and password='".$password."' order by id DESC LIMIT 1";

$rst = Db::query($sql);

$this->success('返回成功', ['data' => $rst]);

}

//获取轮播图

public function banner()

{

$sql = "SELECT * FROM yuyubanner";

$rst = Db::query($sql);

$this->success('返回成功', ['data' => $rst]);

}

//获取网络协议

public function xieyi()

{

$sql = "SELECT * FROM yuyuxieyi";

$rst = Db::query($sql);

$this->success('返回成功', ['data' => $rst]);

}

//所有类型

public function leixing()

{

$sql = " SELECT * FROM yuyutype";

$rst = Db::query($sql);

$this->success('返回成功', ['data' => $rst]);

}

//所有店面

public function stores()

{

$sql = " SELECT * FROM yuyustore";

$rst = Db::query($sql);

$this->success('返回成功', ['data' => $rst]);

}

//店铺信息

public function searchstore()

{

$id = $this->request->request("id");

$sql = " SELECT * FROM yuyustore where id = ".$id;

$sql1 = "SELECT * FROM yuyuproduct where store_id = ".$id;

$rst = Db::query($sql);

$rst1 = Db::query($sql1);

$this->success('返回成功', ['data' => $rst,'product'=>$rst1]);

}

}

使用AVM框架开发应用可以极大缩短开发时间,提升开发效率。感兴趣的小伙伴可以来学习尝试下~

目录
相关文章
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的五大关键步骤
在数据科学领域,搭建一个高效的机器学习模型是实现数据驱动决策的核心。本文详细阐述了从数据预处理到模型评估五个关键步骤,旨在为读者提供一个清晰的建模流程。文中不仅介绍了各个步骤的理论依据,还结合了实用的技术细节,以期帮助读者在实际工作中构建出既健壮又精确的机器学习系统。
526 5
|
应用服务中间件 nginx
『Nginx』Nginx实现同端口代理多项目 及 同项目多端口配置
📣读完这篇文章里你能收获到 - Nginx实现同端口代理多项目 - Nginx实现同项目多端口配置
1862 0
『Nginx』Nginx实现同端口代理多项目 及 同项目多端口配置
|
11月前
|
存储 大数据 数据处理
Pandas入门:安装与基本操作
Pandas 是一个强大的 Python 数据处理库,提供高效的数据结构和分析工具。本文从安装开始,介绍 Pandas 的基本操作,包括 `Series` 和 `DataFrame` 的创建、查看、选择、过滤、添加和删除数据等。同时,指出了一些常见的问题和易错点,帮助初学者快速上手。
501 2
|
10月前
|
人工智能 大数据 网络性能优化
构建超大带宽、超高性能及稳定可观测的全球互联网络
本次课程聚焦构建超大带宽、超高性能及稳定可观测的全球互联网络。首先介绍全球互联网络的功能与应用场景,涵盖云企业网、转发路由器等产品。接着探讨AI时代下全球互联网络面临的挑战,如大规模带宽需求、超低时延、极致稳定性和全面可观测性,并分享相应的解决方案,包括升级转发路由器、基于时延的流量调度和增强网络稳定性。最后宣布降价措施,降低数据与算力连接成本,助力企业全球化发展。
|
SQL 存储 数据可视化
手机短信SQL分析技巧与方法
在手机短信应用中,SQL分析扮演着至关重要的角色
|
JavaScript Shell API
FastAPI是什么?
FastAPI是一个现代、高性能的Python Web框架,专为构建API设计。它利用标准的Python类型提示,支持同步及异步编程,并借助Pydantic实现数据验证。FastAPI以卓越的性能媲美Node.js和Go,代码简洁优雅,能自动生成交互式API文档如Swagger UI和ReDoc,方便测试和调试。其对`async`和`await`的支持使之适用于WebSocket等高并发场景。快速上手仅需安装FastAPI和Uvicorn,编写少量代码即可启动服务并访问自动生成的文档界面。FastAPI不仅易于入门,还支持复杂的功能如依赖注入和后台任务,非常适合追求高性能和快速开发的项目。
722 1
|
小程序
【微信小程序6】引入第三方UI的方法(ColorUi)
【微信小程序6】引入第三方UI的方法(ColorUi)
1210 0
|
SQL 关系型数据库 MySQL
explain是什么?explain优缺点及如何使用explain优化SQL
explain是什么?explain优缺点及如何使用explain优化SQL
516 1
|
Java 数据库连接 数据库
Mybatis-Pagehelper详细解析及优化插件开发
项目数据库数据量较大,分页查询要很久,所以要对分页优化,项目使用的分页是mybatis的Pagehelper,于是在Pagehelper的基础上进行了本次分页查询的优化
|
存储 监控 安全
5 天学会阿里云 RPA:安全性与合规性
随着数字化转型的加速,机器人流程自动化(RPA)技术在各个行业中得到了广泛应用。阿里云 RPA 作为一种领先的 RPA 解决方案,不仅提供了高效的业务流程自动化能力,还高度重视安全性与合规性。在本文中,我们将深入探讨阿里云 RPA 在安全性与合规性方面的优势和措施。