此项目为拼团商城类型,主要功能包括商品分类、商品详情、商品搜索、拼团、订单管理等。
项目源码在 https://github.com/apicloudcom/group-ec 仓库的 widget 目录下。
如果觉得对您有帮助,希望给个 star 鼓励一下。

项目中前端采用 avm多端开发技术进行开发,要点包括 TabLayout 布局、swiper 轮播图、rich-text 富文本、scroll-view 滚动视图、下拉刷新、组件封装等。使用 APICloud 多端技术进行开发,实现一套代码多端运行,支持编译成 Android & iOS App 以及微信小程序。

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

使用步骤

  1. 使用 APICloud Studio 3 作为开发工具。
  2. 下载本项目源码。
  3. 在开发工具中新建项目,并将本源码导入新建的项目中,注意更新config.xml 中的 appid 为你项目的 appid。
  4. 使用 AppLoader 进行真机同步调试预览。
  5. 或者提交项目源码,并为当前项目云编译自定义 Loader 进行真机同步调试预览。
  6. 云编译 生成 Android & iOS App以及微信小程序源码包。

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

网络请求接口封装

在 script/util.js 中,封装了统一的网络请求接口 ajax 方法,对整个项目的请求进行统一管理,包括处理传入参数、拼装完整请求 url、设置请求头等,最后调用 api.ajax 方法发起请求,在请求的回调方法里面还对 cookie 是否过期做了全局判断,过期后会清除本地用户登录信息,并提示重新登录。

// util.js
ajax(p, callback) {var param = p;if (!param.headers) {param.headers = {};}param.headers['X-AppToken'] = UserCenter.getAccessToken();if (param.data && param.data.body) {param.headers['Content-Type'] = 'application/json; charset=utf-8';}if (param.url) {var baseUrl = 'https://a6047344573226-dev.apicloud-saas.com/api/';param.url = baseUrl + param.url;}api.ajax(param, (res, err)=> {let ret = res;if (err && err.body && err.body.errCode) {ret = err.body;callback(ret);} else {callback(ret, err);}let sessionExpiration = false;if (ret && ret.errCode && ret.errCode>100) {sessionExpiration = true;}if (sessionExpiration) {var didShowLogoutAlert = api.getGlobalData({key: 'didShowLogoutAlert'});if (!didShowLogoutAlert) {api.setGlobalData({key: 'didShowLogoutAlert',value: true});UserCenter.setUserInfo('');api.confirm({msg: '登录已失效,请重新登录',buttons: ['取消', '重新登录']}, (ret)=> {api.setGlobalData({key: 'didShowLogoutAlert',value: false});if (ret.buttonIndex == 2) {this.goLogin();}});}}});
}

用户登录信息管理

在 script/user.js 中,对用户登录信息进行了封装,做了统一管理,可以方便地判断是否登录、保存和获取用户信息、以及判断登录是否过期的 accessToken 等。

const UserCenter = {isLogin(){let access_token = this.getAccessToken();return access_token?true:false;},setUserInfo(userInfo){delete userInfo.addtime;api.setPrefs({key: 'userInfo',value: userInfo});api.setPrefs({key: 'access_token',value: userInfo.access_token?userInfo.access_token:''});},getUserInfo(){let userInfo = api.getPrefs({sync: true,key: 'userInfo'});return userInfo?JSON.parse(userInfo):'';},getAccessToken(){return api.getPrefs({sync: true,key: 'access_token'});}
};export default UserCenter;

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","shadow": "#f1f1f1","hideBackButton": true},"tabBar": {"scrollEnabled": false,"background": "#fff","shadow": "#f1f1f1","color": "#aaa","selectedColor": "#339DFF","preload": 0,"frames": [{"name": "page1","url": "pages/main1/main1.stml","title": "拼团商城"}, {"name": "page2","url": "pages/main2/main2.stml","title": "分类"}, {"name": "page4","url": "pages/main4/main4.stml","title": "我的"}],"list": [{"text": "首页","iconPath": "images/common/main1_1.png","selectedIconPath": "images/common/main1.png"}, {"text": "分类","iconPath": "images/common/main2_1.png","selectedIconPath": "images/common/main2.png"}, {"text": "我的","iconPath": "images/common/main4_1.png","selectedIconPath": "images/common/main4.png"}]}
}

这里”我的“页面隐藏了导航栏,而其它页面没有隐藏。”我的“页面路径为 pages/main4/main4.stml,我们参照微信小程序的语法,在同目录下放置了 main4.json 文件,在里面配置 navigationStyle 字段为 custom。

{"navigationStyle":"custom"
}

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

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

轮播图实现

首页和商品详情页面都使用了轮播图,这里以首页为例,首页路径为 pages/main1/main1.stml,里面轮播图使用 swiper 组件实现,使用 v-for 指令循环 swiper-item,bannersList 为定义的数组类型的属性。这里监听了图片的 click 事件,点击后需要跳转到对应的详情页面。这里使用了自定义的指示器,通过设置指示器容器的 position 定位属性为 absolute,来让指示器显示到当前轮播图的上面。

<view class="banner_box" style={'height:'+swiperHeight+'px;'}><swiper class="banner_swiper" circular autoplay11 onchange="fnSwiperChange"><swiper-item v-for="(item_, index_) in bannerList"><image class="banner_img" src={item_.icon} mode="aspectFill" onclick="fnBannerPage" data-index={index_}></image></swiper-item></swiper><view class="banner_dots"><view v-for="(item, index) in bannerList" class={current == index ? 'banner_dot-on' : 'banner_dot'}></view></view>
</view>

为保持不同分辨率设备上面图片显示比例不变,需要让轮播图的宽度跟随屏幕宽度变化,高度则通过计算属性 swiperHeight 来动态计算得到。

computed:{swiperHeight(){return Math.floor((api.winWidth - 30)*0.4+20);}
}

rich-text 富文本的使用

在商品详情页中,商品详情部分就是使用的 rich-text 来展示的,使用时如果没为 rich-text 设置高度,其高度就为里面内容的高度。

<rich-text nodes={html}></rich-text>

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

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

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

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

<scroll-view class="scroll-view" scroll-y enable-back-to-top refresher-enabled refresher-triggered={refresherTriggered} onrefresherrefresh="onrefresherrefresh" onscrolltolower="onscrolltolower"><list-item v-for="(item) in goodsList" item={item} showOriginalPrice onitemClick="fnOpenDetails"></list-item><no-data v-if={showNoData} image="../../images/common/nolist.png" desc="暂无商品"></no-data>
</scroll-view>

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

onrefresherrefresh(){this.data.refresherTriggered = true;this.getData(false);
}

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

getData(loadMore){let that = this;if (!loadMore) {that.data.page = 1;}this.data.loading = true;var url = "homes/getGoodsList?classid=" + that.data.classId + "&page=" + that.data.page;$util.ajax({url: url}, function(res, err){if (res && res.errcode == 0) {let list = res.data;that.data.haveMore = list.length > 0;if (loadMore) {that.data.goodsList = that.data.goodsList.concat(list);} else {that.data.goodsList = list;}if (list.length > 0) {that.data.page += 1;}}that.data.loading = false;that.data.refresherTriggered = false;that.data.showNoData = that.data.goodsList.length == 0;$util.hideProgress();});
}

自定义三级联动城市选择器组件

在填写收货地址页面(pages/address_edit/address_edit.stml)里面有一需求,为选择收货地址城市区域,为此我们在 picker 组件的基础上封装了一个 region-picker 组件(components/region-picker.stml),使用时监听该组件的 change 事件,就可以获取到选择的城市区域的名称和城市代码。

// address_edit.stml<region-picker region={qustr||''} onchange="fnChooseStr"></region-picker>fnChooseStr(e){let code = e.detail.code;let val = e.detail.value;this.data.quid = code.join(",");this.data.qustr = val.join(",");}

平台差异化处理

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

// util.js
isApp(){if (api.platform && api.platform == 'app') {return true;}return false;
},
isMp(){if (api.platform && api.platform == 'mp') {return true;}return false;
}

APICloud 多端开发 | 拼团商城项目开发难点相关推荐

  1. 小程序拼团商城系统开发

    最近了解到目前,随着电子商务产业的快速发展,网上商城系统成本低,速度快等优势为众多企业带来了机遇,营销功能丰富,商品系统完善,用户体验良好. PHP程序快速开发,运行速度快,技术本身可以快速学习.嵌入 ...

  2. python开发小程序拼团_拼团商城模式开发(如何开发)

    什么是全民拼团系统 微信拼团是团购+社交分享模式的演变,兼具超强吸粉与促销功能.商联达全民拼团系统帮助商家快速搭建自己的微信拼团平台,自己收钱.自己累积粉丝.自己管理分销渠道.用户可通过商家的拼团商城 ...

  3. 拼团不中返利模式开发(拼团商城返现系统源码设计)

    从火爆至今的拼多多到如雨后春笋般四处成立的零售批发商城,个体商家小程序.APP等系统,拼团和团购都作为一个商家让利推广的必要手段,传统的拼团和团购大多是商家为了薄利多销,以团购的名义向客户低价销售商品 ...

  4. 幸运拼团app系统软件开发介绍案例

    互联网在连接世界之后将诞生海量数据,这种数据的价值会极大解放人类,诞生伟大的AⅠ.大数据因为存储和连接,把原来束缚人类大脑与四肢的许多难题的解决变为可能.每一次的技术发展,最重要的结果是解放人类的体力 ...

  5. 免单拼团商城小程序开发

    免单拼团商城小程序开发 概述// 免单活动是现在商家比较喜欢的一种营销活动,几乎所有的商家都是通过免单系统进行免单的,市面上大部分的免单系统都是只有排队免单的功能,免单周期较长且比较单一,但是我们免单 ...

  6. 多商户商城系统功能拆解36讲-平台端营销-拼团记录

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统.可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城. 多商户商城系统支持商家入驻加盟,同时满足平台自营.旗舰店等多种经营方 ...

  7. 多商户商城系统功能拆解35讲-平台端营销-拼团商品

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统.可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城. 多商户商城系统支持商家入驻加盟,同时满足平台自营.旗舰店等多种经营方 ...

  8. 多功能拼团商城源码-带优惠券功能+自适应移动端+对接免签约支付

    简介: 开发语言:PHP 数据库:MySQL 这款拼团商城源码非常完整,源码整体也非常简洁,功能挺全面的,有拼团.优惠券.限时折扣等功能 对接了个人免签约,省去了申请收款接口的麻烦 安装教程: 测试环 ...

  9. 拼团商城小程序高保真原型模板、支付、优惠券、客服、物流、收藏、足迹、优惠券、订单管理、评价、设置、地址、售后、拼团、消息通知、商城小程序、电商小程序、拼团电商、移动端电商、高保真电商、电商app

    主要功能:首页:(轮播图.活动快速入口.商品推荐).搜索 分类: 商品分类(三级显示).商品详情.拼团or单独购买.订单结算.拼团状态  消息:(客服.通知.物流.活动)我的:收藏.足迹.优惠券.订单 ...

最新文章

  1. timer.schedule —— timer定时器的用法
  2. lamp ci框架 php配置文件,LAMP环境搭建
  3. MATLAB教程(1) MATLAB 基础知识(2)
  4. ripro子主题eeesucai-child集成后台美化包(适用于设计素材站+资源下载站等)
  5. linux精简版远程登录,Linux下如何定制SSH来简化远程访问
  6. 嵌入式电路设计(fpga电路设计)
  7. 基于Redis的微博计算好友关系
  8. 微信小程序——评论点赞功能
  9. android游戏勿扰,App+1 | Android 勿扰自动化,看剧、游戏更「沉浸」:NoPopping
  10. ppt模板免费下载的网站有哪些?这个宝藏网站必须make
  11. 春节期间,哪些信用卡取现不用手续费?
  12. 2021年计算机软考时间公布啦
  13. 借记来帐,借记往账,贷记来帐,贷记往账
  14. ZYNQ开发系列——PS响应PL中断请求
  15. python数字转大写字母_python变量名称如何转化为大写字母?
  16. 电锯惊魂—经典的语言
  17. FLASH 上传控件传输,服务端保存文件
  18. Jenkins 登录忘记用户名和密码
  19. ev3dev:c语言开发lego ev3主机
  20. 【CEGUI】概念简介

热门文章

  1. hive建表报错FAILED: ParseException line 2:0 Failed to recognize predicate ‘date‘. Failed rule: ‘identifi
  2. C语言学生成绩管理系统——检查学号姓名,双向循环链表
  3. Android Alarm定时任务基础
  4. UltraEdit 27.0.0.24 中文版 — 文本代码编辑工具
  5. 学习总结——按下按键灯亮,再次按下按键,灯灭
  6. 机器视觉表面缺陷检测综述
  7. Linux如何管理进程
  8. 易签指纹签到系统测试文档
  9. 23_字符串的格式化_format 函数_% 占位符 _ f-string _Template _模板字符等
  10. 【题解反思】海亮信息集训A-B班-分治初步专项