[关闭]
@langlibaitiao 2017-07-06T14:24:57.000000Z 字数 15643 阅读 1013

微信小程序(demo)

小程序


一 获取小程序的AppId

1 注册微信公众平台账号,登录:https://mp.weixin.qq.com,就可以在网站的“设置”-“开发者设置”中,查看到微信小程序的 AppID 。

注意:如果要以非管理员微信号在手机上体验该小程序,那么我们还需要操作“绑定开发者”。即在“用户身份”-“开发者”模块,绑定上需要体验该小程序的微信号。本文档默认注册帐号、体验都是使用管理员微信号。

二 微信开发者工具

1 我们需要通过开发者工具,来完成小程序创建和代码编辑。开发者工具集成了开发调试、代码编辑及程序发布等功能。

链接:开发者工具下载地址

三 创建项目

1 开发者工具安装完成后:

(1) 打开并使用微信扫码登录,
(2) 选择创建“项目”,填入上文获取到的AppID,
(3) 设置一个本地项目的名称(非小程序名称),比如“小程序demo”,并选择一个本地的文件夹作为代码存储的目录,
(4) 点击“新建项目”就可以了。

2 在创建过程中:

如果选择的本地文件夹是个空文件夹,开发者工具会提示,是否需要创建一个 quick start  项目。选择“是”,开发者工具会帮助我们在开发目录里生成一个简单的 demo。其中初始化了文件结构并包含了一些简单的文件。

3 项目创建成功后:

我们就可以点击该项目,进入并看到完整的开发者工具界面,点击左侧导航,在“编辑”里可以查看和编辑我们的代码,在“调试”里可以测试代码并模拟小程序在微信客户端效果,在“项目”里可以发送到手机里预览实际效果。

四 小程序文件目录结构介绍

1 小程序文件格式介绍

在项目中我们可以看到四种文件类型:

(1) .js后缀的文件是脚本文件,页面的交互等代码在这里实现;
(2) .json后缀的文件是配置文件,主要是json数据格式存放,用于设置程序的配置效果;
(3) .wxss后缀的是样式表文件,类似于前端中的css,用于对界面进行美化;
(4) .wxml后缀的文件是页面结构文件,用于构建页面,在页面上增加控件。

2 pages目录介绍

1 该文件主要存放小程序的页面文件

2 注意:
(1) 小程序每个页面必须有.wxml和.js文件,其他两种类型的文件可以不需要。
(2) 文件名称必须与页面的文件夹名称相同,如index文件夹,文件只能是index.wxml、index.wxss、index.js和index.json.

3 utils目录介绍

(1) 该文件夹主要用于存放全局的一些.js文件,公共用到的一些事件处理代码文件可以放到该文件夹下,用于全局调用。

(2) 对于允许外部调用的方法,用module.exports进行声明,才能在其他js文件中用一下代码引入
  1. function formatTime(date) {
  2. var year = date.getFullYear()
  3. var month = date.getMonth() + 1
  4. var day = date.getDate()
  5. var hour = date.getHours()
  6. var minute = date.getMinutes()
  7. var second = date.getSeconds()
  8. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
  9. }
  10. function formatNumber(n) {
  11. n = n.toString()
  12. return n[1] ? n : '0' + n
  13. }
  14. //发送请求 post方式
  15. var rootDocment = 'https://api.orangelife.com.cn/'; //正式
  16. // var rootDocment = 'http://eastapi.swao.cn/'; //测试
  17. function req(url, data, cb) {
  18. wx.request({
  19. url: rootDocment + url,
  20. data: data,
  21. method: 'POST',
  22. header: { 'Content-Type': 'application/json' },
  23. success: function (res) {
  24. console.log(res)
  25. return typeof cb == "function" && cb(res.data)
  26. },
  27. fail: function () {
  28. return typeof cb == "function" && cb(false)
  29. }
  30. })
  31. }
  32. //发送请求 get方式
  33. function getReq(url, data, cb) {
  34. wx.request({
  35. url: rootDocment + url,
  36. data: data,
  37. method: 'GET',
  38. header: { 'Content-Type': 'application/x-www-form-urlencoded' },
  39. success: function (res) {
  40. return typeof cb == "function" && cb(res.data)
  41. },
  42. fail: function () {
  43. return typeof cb == "function" && cb(false)
  44. }
  45. })
  46. }
  47. // 去前后空格
  48. function trim(str) {
  49. return str.replace(/(^\s*)|(\s*$)/g, "");
  50. }
  51. // 提示错误信息
  52. function isError(msg, that) {
  53. that.setData({
  54. showTopTips: true,
  55. errorMsg: msg
  56. })
  57. }
  58. // 清空错误信息
  59. function clearError(that) {
  60. that.setData({
  61. showTopTips: false,
  62. errorMsg: ""
  63. })
  64. }
  65. //上传文件
  66. function uploadFile(url, filePath, name, formData, cb) {
  67. console.log('a=' + filePath, formData)
  68. wx.uploadFile({
  69. url: rootDocment + url,
  70. filePath: filePath,
  71. name: name,
  72. header: {
  73. 'content-type': 'multipart/form-data'
  74. }, // 设置请求的 header
  75. formData: formData, // HTTP 请求中其他额外的 form data
  76. success: function (res) {
  77. console.log(res)
  78. console.log(res.head_image)
  79. if (res.statusCode == 200 && !res.data.result_code) {
  80. return typeof cb == "function" && cb(res.head_image)
  81. } else {
  82. return typeof cb == "function" && cb(false)
  83. }
  84. },
  85. fail: function () {
  86. return typeof cb == "function" && cb(false)
  87. }
  88. })
  89. }
  90. //用module.exports对外暴露接口
  91. module.exports = {
  92. formatTime: formatTime,
  93. req: req,
  94. getReq: getReq,
  95. trim: trim,
  96. isError: isError,
  97. clearError: clearError,
  98. uploadFile: uploadFile
  99. }
  1. //在需要使用这些模块的文件中,使用 require(path) 将公共代码引入
  2. var util = require('../../utils/util.js')

4 app.js、app.json、app.wxss

4.1 app.js :

1 小程序的脚本代码
我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。调用框架提供的丰富的 API,想了解更多可用 API,可参考 [API文档]

2 小程序注册
App() 函数用来注册一个小程序。接受一个 object 参数,其指定小程序的生命周期函数等。

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. //调用API从本地缓存中获取数据
  5. var logs = wx.getStorageSync('logs') || []
  6. logs.unshift(Date.now())
  7. wx.setStorageSync('logs', logs)
  8. },
  9. getUserInfo:function(cb){
  10. var that = this
  11. if(this.globalData.userInfo){
  12. typeof cb == "function" && cb(this.globalData.userInfo)
  13. }else{
  14. //调用登录接口
  15. wx.login({
  16. success: function () {
  17. wx.getUserInfo({
  18. success: function (res) {
  19. that.globalData.userInfo = res.userInfo
  20. typeof cb == "function" && cb(that.globalData.userInfo)
  21. }
  22. })
  23. }
  24. })
  25. }
  26. },
  27. //全局参数,可以在其他页面通过接口获取到,全局使用的参数可以在这里进行声明
  28. globalData:{
  29. userInfo:null
  30. }
  31. })
  1. //全局参数可以在其他页面通过下面方法获取到
  2. var app = getApp();
  3. console.log(app. globalData);

4.2 app.json :
是对整个小程序的全局配置。我们可以在这个文件中配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。注意该文件不可添加任何注释。更多可配置项可参考[配置详解]

部分配置解释:

(1) 此处tabBar下的list为底部列表栏配置;注意:tabBar如果设置,最少要两个,最多不能超过五个。
(2) networkTimeout和debug可以设置各种网络请求的超时时间
(3) debug:可以在开发者工具中开启debug模式,在开发者工具的控制台面板,调用信息以info的形式给出,其信息有page注册、页面路由、数据更新和时间触发,可以帮开发者快速定位一些常见信息。
  1. /**app.json**/
  2. {
  3. "pages": [
  4. "pages/index/index",
  5. "pages/mall/list/list",
  6. "pages/login/login",
  7. "pages/user/user",
  8. "pages/mall/detail/detail",
  9. "pages/location/location"
  10. ],
  11. "window": {
  12. "backgroundTextStyle": "light",
  13. "navigationBarBackgroundColor": "pink",
  14. "navigationBarTitleText": "智橙生活",
  15. "navigationBarTextStyle": "black"
  16. },
  17. "tabBar": {
  18. "list": [
  19. {
  20. "pagePath": "pages/index/index",
  21. "text": "首页",
  22. "iconPath": "images/tabBar/index.png",
  23. "selectedIconPath": "images/tabBar/index-select.png"
  24. },
  25. {
  26. "pagePath": "pages/mall/list/list",
  27. "text": "商城",
  28. "iconPath": "images/tabBar/market.png",
  29. "selectedIconPath": "images/tabBar/market-select.png"
  30. },
  31. {
  32. "pagePath": "pages/user/user",
  33. "text": "个人中心",
  34. "iconPath": "images/tabBar/setting.png",
  35. "selectedIconPath": "images/tabBar/setting-select.png"
  36. }
  37. ],
  38. "color": "#000",
  39. "backgroundColor": "pink",
  40. "selectedColor": "#f60",
  41. "borderStyle": "#ccc"
  42. },
  43. "networkTimeout": {
  44. "request": 20000,
  45. "connectSocket": 20000,
  46. "uploadFile": 20000,
  47. "downloadFile": 20000
  48. },
  49. "debug": true
  50. }

4.3 app.wxss :
全局的界面美化代码

  1. /**app.wxss**/
  2. @import "dist/style/weui.wxss";
  3. .container {
  4. height: 100%;
  5. display: flex;
  6. flex-direction: column;
  7. align-items: center;
  8. justify-content: space-between;
  9. padding: 200rpx 0;
  10. box-sizing: border-box;
  11. }

5 页面注册.js

1 注册一个页面

  1. // detail.js
  2. var app = getApp();
  3. var util = require('../../../utils/util.js');
  4. Page({//页面数据配置
  5. data: {
  6. msgDetail: {},
  7. imgUrls:[],
  8. autoplay: true,
  9. indicatorDots: true,
  10. interval: 4000,
  11. duration: 1000
  12. },
  13. onLoad: function (options) {
  14. console.log(options)
  15. var that = this;
  16. util.req('mall/getItemDetailV4', {//请求接口
  17. // id: options.id
  18. itemId: options.itemId,
  19. activityId: options.activityId
  20. }, function (res) {
  21. that.setData({// 改变信息
  22. msgDetail: res.data.itemDetail,
  23. imgUrls: res.data.itemDetail.pics
  24. })
  25. });
  26. },
  27. onReady: function () {
  28. // 页面渲染完成
  29. },
  30. onShow: function () {
  31. // 页面显示
  32. },
  33. onHide: function () {
  34. // 页面隐藏
  35. },
  36. onUnload: function () {
  37. // 页面关闭
  38. }
  39. })
Page({}),注册一个页面,中间的代码为声明周期函数,可以不实现,但是Page({})结构必须创建。

注意:只有在data中声明的数据才能够正常使用

五 本demo中的一些方法与属性

1 响应的数据绑定

整个系统分为两块视图层(View)和逻辑层(App Service)

框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新。

通过这个简单的例子来看:

index.wxml文件下:

  1. <!--index.wxml-->
  2. <view class="container">
  3. <view bindtap="bindViewTap" class="userinfo">
  4. <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
  5. <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  6. </view>
  7. <view class="usermotto">
  8. <text class="user-motto">{{motto}}</text>
  9. </view>
  10. <button bindtap="changeName">{{clickData}}</button>
  11. </view>

index.js文件如下:

  1. //index.js
  2. //获取应用实例
  3. var app = getApp()
  4. Page({
  5. data: {
  6. motto: '综合服务生活平台',
  7. clickData: '点我试试',
  8. userInfo: {}
  9. },
  10. changeName: function (e) {
  11. this.setData({
  12. motto: "智橙生活",
  13. clickData: '试试就试试',
  14. })
  15. },
  16. onLoad: function () {
  17. var that = this
  18. //调用应用实例的方法获取全局数据
  19. app.getUserInfo(function(userInfo){
  20. //更新数据
  21. that.setData({
  22. userInfo:userInfo
  23. })
  24. })
  25. }
  26. })

2 商品列表页面代码

(1) 上拉加载,下拉刷新, 分页
  1. // 下拉刷新数据
  2. pullDownRefresh: function () {
  3. var that = this;
  4. pageNum = 0;
  5. //tab0
  6. var objBuy0 = that.data.isBuying;
  7. objBuy0.msgList = [];
  8. //tab1
  9. var objBuy1 = that.data.isBuying;
  10. objBuy1.msgList = [];
  11. that.setData({
  12. isBuying: objBuy0,
  13. futureBuying: objBuy1,
  14. scrollTop: 0
  15. });
  16. loadMsgData0(that);
  17. },
  18. // 上拉加载数据
  19. pullUpLoad: function () {
  20. var that = this;
  21. if (!that.data.isLastPage) {
  22. loadMsgData0(that);
  23. }
  24. },
(2) 页面跳转
  1. 调用 API wx.navigateTo 或使用组件 <navigator open-type="navigateTo"/>

pages/mall/list/list.js

  1. var util = require('../../../utils/util.js');
  2. var app = getApp();
  3. // 加载数据
  4. var loadMsgData0 = function (that) {
  5. //初始化隐藏列表
  6. var objBuy0 = that.data.isBuying;
  7. objBuy0.hidden = false;
  8. that.setData({
  9. isBuying: objBuy0
  10. });
  11. var allMsg = objBuy0.msgList;
  12. util.req('mall/getPanicBuyItemList', {
  13. "index": objBuy0.pageNum,
  14. "size": objBuy0.pageSize,
  15. "flag": "current"
  16. }, function (res) {
  17. //生成新的商品信息数组
  18. allMsg = allMsg.concat(res.page.content);
  19. objBuy0.hidden = true,
  20. objBuy0.msgList = allMsg,
  21. objBuy0.isLastPage = res.page.last,
  22. that.setData({
  23. isBuying: objBuy0
  24. });
  25. objBuy0.pageNum++;
  26. if (!!res.page.last){
  27. objBuy0.nomore = false;
  28. that.setData({
  29. isBuying: objBuy0
  30. });
  31. }
  32. });
  33. };
  34. var loadMsgData1 = function(that){
  35. //初始化隐藏列表
  36. var objBuy1 = that.data.futureBuying;
  37. objBuy1.hidden = false;
  38. that.setData({
  39. futureBuying: objBuy1
  40. });
  41. var allMsg = objBuy1.msgList;
  42. util.req('squareDance/getSquareDanceVideoPage', {
  43. "index": objBuy1.pageNum,
  44. "size": objBuy1.pageSize
  45. }, function (res) {
  46. console.log(res)
  47. //生成新的商品信息数组
  48. allMsg = allMsg.concat(res.content);
  49. objBuy1.hidden = true,
  50. objBuy1.msgList = allMsg,
  51. objBuy1.isLastPage = res.last,
  52. that.setData({
  53. futureBuying: objBuy1
  54. });
  55. objBuy1.pageNum++;
  56. if (!!res.last) {
  57. objBuy1.nomore = false;
  58. that.setData({
  59. futureBuying: objBuy1
  60. });
  61. }
  62. });
  63. };
  64. var loadMsgData2 = function (that) {
  65. //初始化隐藏列表
  66. var objBuy2 = that.data.futureBuying1;
  67. objBuy2.hidden = false;
  68. that.setData({
  69. futureBuying1: objBuy2
  70. });
  71. var allMsg = objBuy2.msgList;
  72. util.req('mall/getPanicBuyItemList', {
  73. "index": objBuy2.pageNum,
  74. "size": objBuy2.pageSize,
  75. "flag": "wait"
  76. }, function (res) {
  77. //生成新的商品信息数组
  78. allMsg = allMsg.concat(res.page.content);
  79. objBuy2.hidden = true,
  80. objBuy2.msgList = allMsg,
  81. objBuy2.isLastPage = res.page.last,
  82. that.setData({
  83. futureBuying1: objBuy2
  84. });
  85. objBuy2.pageNum++;
  86. if (!!res.page.last) {
  87. objBuy2.nomore = false;
  88. that.setData({
  89. futureBuying1: objBuy2
  90. });
  91. }
  92. });
  93. };
  94. //页面数据配置
  95. Page({
  96. data: {
  97. scrollTop: 0,
  98. scrollHeight: 0,
  99. //tab栏的下标
  100. pageTab: {
  101. curHdIndex: 0,
  102. curBdIndex: 0
  103. },
  104. isBuying: {
  105. hidden: true,
  106. isLastPage: false,
  107. nomore: true,
  108. pageNum: 0,
  109. pageSize: 7,
  110. msgList: []
  111. },
  112. futureBuying: {
  113. hidden: true,
  114. isLastPage: false,
  115. nomore: true,
  116. pageNum: 0,
  117. pageSize: 7,
  118. msgList: []
  119. },
  120. futureBuying1: {
  121. hidden: true,
  122. isLastPage: false,
  123. nomore: true,
  124. pageNum: 0,
  125. pageSize: 7,
  126. msgList: []
  127. }
  128. },
  129. pageHdtap: function (e) {
  130. var that = this;
  131. console.log(e)
  132. //点击子元素
  133. var _datasetId = e.target.dataset.id;
  134. var _leftObj = {};
  135. _leftObj.curHdIndex = _datasetId;
  136. _leftObj.curBdIndex = _datasetId;
  137. that.setData({
  138. scrollTop: 0,
  139. pageTab: _leftObj,
  140. isBuying: {
  141. hidden: true,
  142. isLastPage: false,
  143. nomore: true,
  144. pageNum: 0,
  145. pageSize: 7,
  146. msgList: []
  147. },
  148. futureBuying: {
  149. hidden: true,
  150. isLastPage: false,
  151. nomore: true,
  152. pageNum: 0,
  153. pageSize: 7,
  154. msgList: []
  155. }
  156. });
  157. if (_datasetId == 0) {
  158. //初始化第0页数据
  159. loadMsgData0(that);
  160. } else if (_datasetId == 1){
  161. //初始化第1页数据
  162. loadMsgData1(that);
  163. }else{
  164. //初始化第2页数据
  165. loadMsgData2(that);
  166. }
  167. },
  168. onLoad: function (options) {
  169. // 页面初始化 options为页面跳转所带来的参数
  170. var that = this;
  171. wx.getSystemInfo({
  172. success: function (res) {
  173. that.setData({
  174. windowHeight: res.windowHeight,
  175. windowWidth: res.windowWidth
  176. })
  177. }
  178. });
  179. loadMsgData0(that);
  180. },
  181. onReady: function () {
  182. // 页面渲染完成
  183. },
  184. onShow: function () {
  185. // 页面显示
  186. },
  187. // 下拉刷新数据
  188. pullDownRefresh: function () {
  189. var that = this;
  190. //0
  191. var objBuy0 = that.data.isBuying;
  192. objBuy0.pageNum = 0;
  193. objBuy0.msgList = [];
  194. //1
  195. var objBuy1 = that.data.futureBuying;
  196. objBuy1.pageNum = 0;
  197. objBuy1.msgList = [];
  198. var objBuy2 = that.data.futureBuying1;
  199. objBuy2.pageNum = 0;
  200. objBuy2.msgList = [];
  201. that.setData({
  202. isBuying: objBuy0,
  203. futureBuying: objBuy1,
  204. futureBuying1: objBuy2,
  205. scrollTop: 0
  206. });
  207. loadMsgData0(that);
  208. loadMsgData1(that);
  209. loadMsgData2(that);
  210. },
  211. // 上拉加载数据
  212. pullUpLoad: function () {
  213. var that = this;
  214. if (!that.data.isBuying.isLastPage) {
  215. loadMsgData0(that)
  216. }
  217. if (!that.data.futureBuying.isLastPage) {
  218. loadMsgData1(that)
  219. }
  220. if (!that.data.futureBuying1.isLastPage) {
  221. loadMsgData2(that)
  222. }
  223. },
  224. // 定位数据
  225. scroll: function (event) {
  226. var that = this;
  227. that.setData({
  228. scrollTop: event.detail.scrollTop
  229. });
  230. },
  231. onHide: function () {
  232. // 页面隐藏
  233. },
  234. onUnload: function () {
  235. // 页面关闭
  236. }
  237. })

pages/mall/list/list.json

  1. {
  2. "navigationBarTitleText": "商品列表",//当前页面的标题
  3. }

pages/mall/list/list.wxml

  1. <view class="page">
  2. <view class="page__bd">
  3. <!--用name 定义模版-->
  4. <template name="msgTemp">
  5. <view class="weui-panel__bd">
  6. <!--页面路由跳转 -->
  7. <navigator url="../detail/detail?itemId={{itemId}}&activityId={{activityId}}" class="weui-media-box weui-media-box_appmsg" hover-class="weui-cell_active">
  8. <view class="weui-media-box__hd weui-media-box__hd_in-appmsg">
  9. <image class="weui-media-box__thumb" src="{{coverPic}}" style="width: 60px; height: 60px;"/>
  10. </view>
  11. <view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
  12. <view class="">{{name}}</view>
  13. <view class="weui-media-box__desc">{{discountPrice}}</view>
  14. </view>
  15. </navigator>
  16. </view>
  17. </template>
  18. <view class="top" catchtap="pageHdtap">
  19. <view class="tab01 {{pageTab.curHdIndex==0? 'active': ''}}" data-id="0">正在抢购</view>
  20. <view class="tab02 {{pageTab.curHdIndex==1? 'active': ''}}" data-id="1">即将开抢</view>
  21. </view>
  22. <view class="tab-bd" style="height: 100%;">
  23. <!--tab1 start--><!--三目运算符 -->
  24. <view class="tab-bd01 {{pageTab.curBdIndex==0? 'show': 'hide'}}" style="height: 100%;">
  25. <scroll-view scroll-top="{{scrollTop}}" style="height: {{windowHeight}}px; width: {{windowWidth}}px;" scroll-y="true" bindscrolltoupper="pullDownRefresh" bindscroll="scroll" bindscrolltolower="pullUpLoad" class="weui-panel weui-panel_access">
  26. <view wx:for-items="{{isBuying.msgList}}" wx:key="{{item.itemId}}">
  27. <view class="kind-list__item">
  28. <!--用is 使用模版-->
  29. <template is="msgTemp" data="{{...item}}"/>
  30. </view>
  31. </view>
  32. <view hidden="{{isBuying.nomore}}" class="noMore-content">
  33. 没有更多了
  34. </view>
  35. </scroll-view>
  36. <view>
  37. <loading hidden="{{isBuying.hidden}}" bindchange="loadingChange">
  38. 加载中...
  39. </loading>
  40. </view>
  41. </view>
  42. <!--tab1 end-->
  43. <!--tab2 start-->
  44. <view class="tab-bd02 {{pageTab.curBdIndex==1? 'show': 'hide'}}" style="height: 100%;">
  45. <scroll-view scroll-top="{{scrollTop}}" style="height: {{windowHeight}}px; width: {{windowWidth}}px;" scroll-y="true" bindscrolltoupper="pullDownRefresh" bindscroll="scroll" bindscrolltolower="pullUpLoad" class="weui-panel weui-panel_access">
  46. <view wx:for-items="{{futureBuying.msgList}}" wx:key="{{item.itemId}}">
  47. <view class="kind-list__item">
  48. <!--用is 使用模版-->
  49. <template is="msgTemp" data="{{...item}}"/>
  50. </view>
  51. </view>
  52. <view hidden="{{futureBuying.nomore}}" class="noMore-content">
  53. 没有更多了
  54. </view>
  55. </scroll-view>
  56. <view>
  57. <loading hidden="{{futureBuying.hidden}}" bindchange="loadingChange">
  58. 加载中...
  59. </loading>
  60. </view>
  61. </view>
  62. <!--tab2 end-->
  63. </view>
  64. </view>
  65. <view class="page__ft"></view>
  66. </view>

3 商品详情页面代码

  1. //detail.wxml
  2. <swiper class="detail-swiper" indicator-dots="{{indicatorDots}}" circular = "true"
  3. autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
  4. <block wx:for="{{imgUrls}}">
  5. <swiper-item>
  6. <image src="{{item}}" class="slide-image" width="355" height="250"/>
  7. </swiper-item>
  8. </block>
  9. </swiper>
  10. // detail.js
  11. var app = getApp();
  12. var util = require('../../../utils/util.js');
  13. Page({
  14. data: {
  15. msgDetail: {},
  16. imgUrls:[],
  17. autoplay: true,
  18. indicatorDots: true,
  19. interval: 4000,
  20. duration: 1000
  21. },
  22. onLoad: function (options) {
  23. console.log(options)
  24. var that = this;
  25. util.req('mall/getItemDetailV4', {
  26. // id: options.id
  27. itemId: options.itemId,
  28. activityId: options.activityId
  29. }, function (res) {
  30. that.setData({
  31. msgDetail: res.data.itemDetail,
  32. imgUrls: res.data.itemDetail.pics
  33. })
  34. });
  35. },
  36. onReady: function () {
  37. // 页面渲染完成
  38. },
  39. onShow: function () {
  40. // 页面显示
  41. },
  42. onHide: function () {
  43. // 页面隐藏
  44. },
  45. onUnload: function () {
  46. // 页面关闭
  47. }
  48. })

4 定位页面代码

(1) 获取位置
wx.getLocation(OBJECT) 获取当前的地理位置、速度。
  1. wx.getLocation({
  2. type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
  3. success: function (res) {
  4. that.setData({
  5. hasLocation: true,
  6. location: {
  7. longitude: res.longitude,
  8. latitude: res.latitude
  9. }
  10. })
  11. }
  12. })
(2)wx.openLocation(OBJECT) 使用微信内置地图查看位置
  1. openLocation: function (e) {
  2. var value = e.detail.value
  3. wx.openLocation({
  4. longitude:value.longitude,
  5. latitude: value.latitude,
  6. scale: 28
  7. })
  8. }

5 登陆页面代码

  1. formSubmit: function (e) {
  2. var account = e.detail.value.account;
  3. var password = e.detail.value.password;
  4. var that = this;
  5. wx.login({
  6. success: function(res){
  7. if (res.code){
  8. wx.getUserInfo({
  9. success: function (res1) {//获取userinfo成功
  10. wx.request({
  11. url: 'https://api.orangelife.com.cn/loginV4',
  12. data: {
  13. appCode: null,
  14. mobile: account,
  15. password: password,
  16. captcha_code: '',
  17. captcha_token: ''
  18. },
  19. method: 'POST',
  20. // header: {}, // 设置请求的 header 默认是application/json
  21. success: function (res) {
  22. console.log(res)
  23. // 操作json数据
  24. if (res.statusCode == 200) {
  25. wx.showModal({
  26. title: '登陆状态',
  27. content: '登陆成功',
  28. success: function (res) {
  29. console.log(res)
  30. if (res.confirm) {
  31. // 点击确定后跳转页面并关闭当前页面
  32. wx.switchTab({
  33. url: '../user/user'
  34. })
  35. }
  36. }
  37. })
  38. }
  39. },
  40. fail: function () {
  41. // fail
  42. },
  43. complete: function () {
  44. // complete
  45. }
  46. })
  47. },
  48. fail: function () {
  49. // 调用微信弹窗接口
  50. wx.showModal({
  51. title: '警告',
  52. content: '您点击了拒绝授权,将无法正常使用***的功能体验。请10分钟后再次点击授权,或者删除小程序重新进入。',
  53. success: function (res) {
  54. if (res.confirm) {
  55. console.log('用户点击确定')
  56. }
  57. }
  58. })
  59. }
  60. })
  61. }else{
  62. console.log('获取用户登录态失败!' + res.errMsg)
  63. }
  64. }
  65. })
  66. }

更多信息

[微信公众平台开发者社区]
[框架、组件、API、工具]
[微信小程序联盟]

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注