写点什么
开源 云计算 行业资讯 玩转写作平台 算法 Python 人工智能 区块链 Linux 前端 个人成长 面试 架构师 编程 企业动态 新基建 敏捷 安全 读书笔记 高效工作 团队管理 创业 活动专区 生涯规划 知识管理 运维 产品经理 查看更多

APICloud AVM 多端开发 | 企业 app 开发解析:案例展示、加盟申请功能源码

用户头像
APICloud
关注
发布于: 2021 年 01 月 09 日
APICloud AVM多端开发 | 企业app开发解析:案例展示、加盟申请功能源码

本项目中前端采用 APICloud AVM 多端开发技术进行企业 app 开发,要点包括 TabLayout 布局、swiper 轮播图、rich-text 富文本、scroll-view 滚动视图、下拉刷新等。


项目后端则是使用的 APICloud 数据云 3.0 自定义云函数来构建的。


使用 APICloud 多端技术进行企业 app 开发,实现一套代码多端运行,支持编译成 Android & iOS App 以及微信小程序。项目源码在: https://github.com/apicloudcom/company-display 仓库的 widget 目录下。

使用步骤:

  1. 使用 APICloud Studio 3 作为开发工具。

  2. 下载本项目源码。

  3. 在开发工具中新建项目,并将本源码导入新建的项目中,注意更新,config.xml 中的 appid 为你项目的 appid。

  4. 使用 AppLoader 进行真机同步调试预览。

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

  6. 云编译 生成 Android & iOS App 以及微信小程序源码包。


如果之前未接触过 APICloud 开发,建议先了解一个简单项目的初始化、预览、调试和打包等操作,请参考 APICloud 多端开发快速上手教程。


网络请求接口封装

在 utils/model.js 中,为每一个网络请求接口封装了对应方法,如企业 app 开发首页获取轮播图接口 Model.getbannersList,这些方法最终会调用 Model.request 方法,在 Model.request 方法中对整个项目的请求进行统一管理,包括处理传入参数、拼装请求 url、设置请求头等,最后调用 api.ajax 方法发起请求。


使用示例:

// 通过 import 引入import {Model} from "../../utils/model.js"
// 调用 Model 对象方法Model.getbannersList({}, (res) => {});
复制代码


TabBar 和导航栏的实现

首页使用了 TabLayout 布局来实现 TabBar 和导航栏,在 config.xml 里面配置 content 字段,值为 json 文件路径,在 json 文件中配置 TabBar、导航栏和页面信息。

// config.xml<content src="config.json" />
复制代码


config.json 文件内容如下,设置了 navigationBar 的背景色和标题文字颜色,设置了 tabBar 每项的 icon 和文字,以及每项对应的页面。

{  "name": "root",  "hideNavigationBar": false,  "navigationBar": {    "background": "#fff",    "color": "#000",    "hideBackButton": true  },  "tabBar": {    "scrollEnabled": false,    "background": "#fff",    "shadow": "#f1f1f1",    "color": "#5e5e5e",    "selectedColor": "#333333",    "preload": 0,    "frames": [{      "name": "page1",      "url": "pages/index/index.stml",      "title": "首页"    }, {      "name": "page2",      "url": "pages/case/case.stml",      "title": "案例"    }, {      "name": "page3",      "url": "pages/join/join.stml",      "title": "加盟代理"    }],    "list": [{      "iconPath": "images/toolbar/home@no_selected.png",      "selectedIconPath": "images/toolbar/home@selected.png",      "text": "首页"    }, {      "iconPath": "images/toolbar/case@no_selected.png",      "selectedIconPath": "images/toolbar/case@selected.png",      "text": "案例"    }, {      "iconPath": "images/toolbar/join@no_selected.png",      "selectedIconPath": "images/toolbar/join@selected.png",      "text": "加盟代理"    }]  }}
复制代码



从上面的企业 app 开发效果图中我们可以看到”加盟代理“页面隐藏了导航栏,而其它页面没有隐藏。”加盟代理“页面路径为 pages/join/join.stml,我们参照微信小程序的语法,在同目录下放置了 join.json 文件,在里面配置 navigationStyle 字段为 custom。

{  "navigationBarTitleText": "加盟代理",  "backgroundColor": "#FFFFFF",  "navigationStyle":"custom"}
复制代码


在首页 index.stml 的 apiready 方法里面则监听了 tabBar 每项的点击事件,在 App 端,我们需要在点击事件里面动态设置页面显示、隐藏导航栏。

// index.stmlapi.addEventListener({	name:'tabitembtn'}, function(ret){	var hideNavigationBar = ret.index == 2;	api.setTabLayoutAttr({		hideNavigationBar: hideNavigationBar,		animated: false	});	api.setTabBarAttr({		index: ret.index	});});
复制代码


首页轮播图

首页路径为 pages/index/index.stml,里面轮播图使用 swiper 组件实现,使用 v-for 指令循环 swiper-item,bannersList 为定义的数组类型的属性,在首页的 apiready 方法里面,我们通过调用 getbannersList 方法发起网络请求,获取轮播图片列表数据后赋值给 bannersList 属性。这里监听了 swiper-item 的 click 事件,点击后需要跳转到详情页面。

<view style={'height:'+swiperHeight+'px;'} class="swiper-box">	<swiper class="swiper" autoplay indicator-dots indicator-color="rgba(255,255,255,0.2)" indicator-active-color="rgba(51,51,51,1)">		<swiper-item v-for="(item_,index_) in bannersList" data-index={index_} onclick="bindBanner">			<image src={item_.image} class="banner-image" mode="aspectFill"></image>		</swiper-item>	</swiper></view>
复制代码

轮播图的宽度跟随屏幕宽度变化,高度则通过计算属性 swiperHeight 来动态计算得到。

computed:{	swiperHeight(){		return api.winWidth*0.42;	}}
复制代码


rich-text 富文本的使用

APICloud 这个企业 app 开发项目是信息展示类型,运营人员会在管理后台直接编辑提交富文本信息,因此在项目中很多地方使用了 rich-text 来展示信息,比如在首页中,产品展示和关于信息部分就是使用的 rich-text,如果没为 rich-text 设置高度,其高度就为里面内容的高度。


<view class="goods">	<rich-text v-if={{product_description}} nodes={product_description} /></view><view class="about">	<rich-text v-if={{about_us}} nodes={about_us} /></view>
复制代码

rich-text 用于展示 HTML String 片段,在从服务器获取到 HTML String 后,我们调用 $util.fitRichText 方法处理了一下 HTML String,在 fitRichText 方法中为 img 标签加了最大宽度的限制,以防止图片宽度过大导致显示溢出。

// util.jsfitRichText(richtext, width){   var str = `<img style="max-width:${width}px;"`;   var result = richtext.replace(/\<img/gi, str);   return result;}
复制代码


下拉刷新、滚动到底部加载更多

在”案例“页面(pages/case/case.stml),通过 scroll-view 实现了案例列表展示,同时实现了下拉刷新、滚动到底部加载更多功能。

<scroll-view class="main" scroll-y enable-back-to-top refresher-enabled refresher-triggered={refresherTriggered} onrefresherrefresh={this.onrefresherrefresh} onscrolltolower={this.onscrolltolower}>	<view>		<view class="item" data-id={item.id} onclick={this.openCaseInfo} v-for="(item, index) in caseList">			<image src={item.cover_img} class="item-img"></image>			<text class="item-title">{{item.title}}</text>		</view>	</view>   <view class="footer">       <text class="loadDesc">{loadStateDesc}</text>   </view></scroll-view>
复制代码


下拉刷新使用了 scroll-view 默认的下拉刷新样式,使用 refresher-enabled 字段来开启下拉刷新,为 refresher-triggered 字段绑定了 refresherTriggered 属性来控制下拉刷新状态,需要注意的是,在刷新的事件回调方法里面,我们需要主动设置 refresherTriggered 的值为 true,在数据加载完成后再设置为 false,这样绑定的值有变化,刷新状态才能通知到原生里面。


onrefresherrefresh(){	this.data.refresherTriggered = true;	this.loadData(false);}1234
复制代码


滚动到底部监听了 scroll-view 的 scrolltolower 事件,在滚动到底部后自动加载更多数据,加载更多和下拉刷新都是调用 loadData 方法请求数据,通过 loadMore 参数来进行区分,做分页请求处理。

loadData(loadMore) {	if (this.data.loading) {		return;	}	this.data.loading = true;	var that = this;	var limit = 10;	var skip = loadMore?that.data.skip+1:1;	let params = {		data:{			values:{				status: 1,				skip: skip,				limit: limit			}		}	}	Model.getCasesList(params, (res) => {		if (res && res.status == 0) {			let items = res.data.items;			that.data.haveMoreData = items.length == limit;			if (loadMore) {				that.data.caseList = that.data.caseList.concat(items);			} else {				that.data.caseList = items;			}			that.data.skip = skip;		} else {			that.data.haveMoreData = false;		}		that.data.loading = false;		that.data.refresherTriggered = false;	});}12345678910111213141516171819202122232425262728293031323334
复制代码


scroll-view 滚动到指定元素

在”加盟代理“页面(pages/join/join.stml),最外层是一个 scroll-view,里面有分类列表、分类内容两项,点击分类列表里面某项后会自动滚动到对应的分类内容处,让分类内容可见。

<scroll-view class="main" scroll-y scroll-into-view={viewId} scroll-with-animation enable-back-to-top refresher-enabled refresher-threshold="90" refresher-triggered={refresherTriggered} onrefresherrefresh={this.onrefresherrefresh}>	<!-- 分类列表 -->	<view class="cate">		<view class="cate-item" v-for="(item,index) in list" data-id={item.id} onclick="onitemclick">			<image src={item.image} class="cate-img"></image>			<text class="cate-word">{item.title}</text>		</view>	</view>	<!-- 分类内容 -->	<view class="content">		<view class="content-item" v-for="(item,index) in list" id={'content'+item.id}>			<text class="content-title">{item.title}</text>			<rich-text nodes={item.content} />		</view>	</view></scroll-view>12345678910111213141516
复制代码


滚动到指定视图通过 scroll-view 的 scroll-into-view 属性实现,这里绑定了 viewId 属性,在分类列表项的点击事件 onitemclick 里面,改变 viewId 属性的值,这个值是分类内容里面某项的 id,这样就实现了滚动到指定视图。

onitemclick(e) {	var id = e.currentTarget.dataset.id;	this.data.viewId = 'content' + id;	this.data.viewId = null;}12345
复制代码


平台差异化处理

在多端开发中,难免会遇到不同平台差异化的地方,需要在运行期间做判断处理,为此在 utils/util.js 中封装了 isApp 方法,里面通过 api.platform 属性判断当前运行环境。

// util.jsisApp(){   if (api.platform && api.platform == 'app') {       return true;   }   return false;}1234567
复制代码


例如在 pages/web/web.stml 中,我们使用 v-if、v-else 指令,通过区分平台使用不同的组件来加载 web 链接。

<view class="main">	<frame v-if="$util.isApp()" class="web-view" name="web" url={api.pageParam.link}></frame>	<web-view v-else class="web-view" src={api.pageParam.link}></web-view></view>1234
复制代码


本文只是简单介绍了用 APICloud AVM 多端工具进行企业 app 开发需要注意的问题,想要熟练掌握开发技巧,还是需要开发者自己通过源码不断实践哦!

发布于: 2021 年 01 月 09 日阅读数: 17
小程序flutter, 跨平台 前端框架 前端教程 APICloud
用户头像

APICloud

关注

一次编码多端运行,移动应用低代码开发平台 2020.12.22 加入

APICloud多端技术遵循标准 Web Components组件化思想,兼容Vue 、React语法特性,一次编码同时发布为Android 、iOS 、小程序、Html5(SPA)多端应用。

评论

发布
暂无评论
APICloud AVM多端开发 | 企业app开发解析:案例展示、加盟申请功能源码

民权资讯网万水千山总是情电视剧网站建设哪家较好seo培训南宁市学周易必背歌诀网站建设设计流程步骤教师学习心得体会网络营销推广平台上网站设计宁波湖南微信网站建设关于节日的作文200文具办公店起什么名字好怎么起名字好听男孩云字的艺术签名周易名字测试免费餐饮神秘顾客app宝宝免费起名子网站教育行业起名字健康咨询服务中心起名大米商标起名字大全济宁seo优化卖调料店铺起什么名字k8jd.com冬至写景作文周易免费看八字庄园小课堂企业为什么建设网站龙华网站网站建设对男宝宝起乳名专业网站网站建设seo跟推广少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

民权资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化