开发教程|如何使用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框架开发应用可以极大缩短开发时间,提升开发效率。感兴趣的小伙伴可以来学习尝试下~

目录
相关文章
|
开发框架 小程序 JavaScript
微信小程序wepy框架入门教程-搭建开发环境(一)
微信小程序wepy框架入门教程-搭建开发环境(一)
254 0
|
开发框架 JavaScript 前端开发
HarmonyOS学习路之方舟开发框架—方舟开发框架(ArkUI)概述
方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面开发。
|
缓存 JSON 前端开发
APICloud AVM框架 开发视频会议APP
1.创建会议,确认会议时间、参会人员、会议主题、确定会议主持人(默认为发起人)可开启会议;同时会通过应用消息和短信通知参会人员。2.加入会议,可通过会议大厅找的会议列表直接加入,也可通过输入会议编号加入会议;加入会议的前提是会议已在进行中。3.快速会议,可直接确认会议人员然后发起实时视频会议,参会人员实时接收应用消息或短信,快速进入会议。3.历史会议,分为我主持的会议、我参与的会议。4.会议大厅,列表显示今天需要参加的会议。
APICloud AVM框架 开发视频会议APP
|
存储 XML 缓存
使用APICloud AVM多端框架开发消防检查助手App项目实践分享
使用APICloud AVM多端框架开发消防检查助手App,把消防检查过程中,需要手写填报的文档,在App端以表单填写进行实现。同时可以添加手写签名,关联照片,而且App端表单填报很多项目进行下拉选择,极大的提高了工作效率;表单填报完成之后可通过系统后台生成word模板文件,App端下载到手机,通过手机连接打印机,可把纸质文件进行打印。
269 0
|
SQL 开发框架 数据可视化
使用APICloud AVM多端框架开发课程表功能
本教程主要面向初次使用APICloud Studio3 中可视化工具的新手开发者,旨在通过简单清晰的图文描述,让新手开发者快速掌握可视化工具的使用。
220 0
|
存储 前端开发 API
APICloud移动应用开发疑难解答
1.pointer跟relation的区别? 答:pointer是指这张表的这个字段指向另一张表的某个字段,用于表与表之间建立一对一的关系;relation是指这张表的这个字段指向另一张表中的某几个行的集合,用于表与表之间建立一对多的关系;
162 0
|
存储 JSON 编解码
使用APICloud AVM框架开发人事档案管理助手app实战
由于人事档案具有涉密性,所以本应用没有使用后台服务,全部功能都在APP本地实现。开发工具采用 APICloud Studio3,基于VSCode的(PS:比基于Atom的autio2好用太多)。
545 0
使用APICloud AVM框架开发人事档案管理助手app实战
|
缓存 开发框架 前端开发
实例|APICloud AVM框架开发视频会议APP
APP开发采用的APICloud平台的AVM多端应用开发框架,使用 avm.js 一个技术栈可同时开发 Android & iOS 原生 App、小程序和 iOS 轻 App,且多端渲染效果统一; 全新的 App 引擎 3.0 不依赖 webView,提供百分百的原生渲染,保障 App 性能和体验与原生 App 一致;
252 0
|
前端开发 JavaScript 数据格式
使用APICloud AVM多端框架开发仿微信通讯录功能
本项目基于APICloud AVM框架编写,因此思路要转变下比如标签的用法、CSS样式表的写法、项目的目录结构、dom的操作等都不一样了,完全是Vue、React的编程思维。
237 0
使用APICloud AVM多端框架开发仿微信通讯录功能
|
移动开发 前端开发 JavaScript
使用APICloud AVM框架开发预约应用
前段时间跟朋友一起搞了一个预约的项目,前端用的APICloud的AVM框架做的,后端用的php开发的,用的tp5框架,没几天就搞出来了。简单跟大家分享一下开发中的一些功能点的实现吧。也欢迎大家一起探讨。
258 0
使用APICloud AVM框架开发预约应用