目录

1.运用阿里巴巴的IconFont

2.小程序需要运用到的路由类型

3.绝对定位下的水平居中实现

4.选择图片和视频

5. 小程序连接数据库

6.存储多个对象的数组

7. 上传图片等文件至服务器

8.服务器中的PHP文件传中文数据至数据库乱码

9.获取用户的手机号(巨坑)

10.无法访问上传的图片

11.video组件的controls属性无效

12.配置服务器信息中的request合法域名

13.服务器的数据库数据以Json格式接收和回传

14.获取数据库返回的json格式的数据长度

15.从服务器获取的jsonObject需转成数组才能添加额外属性

16.引入图表wxcharts.js

17.左滑删除

18.写过最长的SQL语句


1.运用阿里巴巴的IconFont

将喜欢的icon收藏起来后添加到相应的项目中,然后下载至本地,得到download.zip压缩文件。

将压缩文件解压,把文件夹中的iconfont.css改名为icon.wxss,然后复制粘贴到小程序项目中

当需要引用某个icon时,可在icon.wxss中或是打开解压得到的文件demo_index.html找到对应的编号(如:照相机icon的编号是e663)

以照相机icon为例,将icon的名称和编号应用到以下的模板中

<!--demo.wxml-->
<icon class="iconfont icon-camera"></icon>

在demo.wxss中import一开始改了名的icon.wxss文件

@import "../../icon.wxss";.icon-camera{font-size: 56rpx;
}

即可显示对应的照相机icon了

2.小程序需要运用到的路由类型

3.绝对定位下的水平居中实现

.btn{position: absolute;left: 0;right: 0;margin: auto;
}

4.选择图片和视频

①实现页面的布局

.wxml文件如下:

<text class="titletext textfont">添加图片(最多选4张)</text><view class="addImage"><block wx:for="{{imgArr}}" wx:key="key"><view class="selected" data-id="{{index}}"><image class="itemImage" data-id="{{index}}" src="{{item}}" bindtap="showImage"></image><image class="closeImv" src="../../images/close.png" mode="scaleToFill" catchtap="deleteImage"  data-id="{{index}}"></image><view class="info textfont"><view class="subInfo"><text>名称</text><input class="nameInput " data-id="{{index}}" maxlength='10'></input></view><view class="subInfo"><text>备注</text><textarea class="remarkInput" data-id="{{index}}" maxlength='50'></textarea></view></view></view></block><view class="chooseView" bindtap="chooseImage" wx:if="{{chooseImageShow}}"><image class="chooseImv" src="../../images/add.png"></image></view></view><text class="titletext textfont">添加视频(最多选2段)</text><view class="addVideo"><block wx:for="{{videoArr}}" wx:key="key"><view class="selected"  data-id="{{index}}"><video class="itemVideo" data-id="{{index}}" id="{{index}}" src="{{item}}" bindtap="showVideo"></video><image class="closeImv" src="../../images/close.png" mode="scaleToFill" catchtap="deleteVideo" data-id="{{index}}"></image><view class="info textfont"><view class="subInfo"><text>名称</text><input class="nameInput " data-id="{{index}}" maxlength='10'></input></view><view class="subInfo"><text>备注</text><textarea class="remarkInput" data-id="{{index}}" maxlength='50'></textarea></view></view></view></block><view class="chooseView" bindtap="chooseVideo" wx:if="{{chooseVideoShow}}"><image class="chooseImv" src="../../images/add.png"></image></view></view>

.wxss文件如下:

.addImage{margin-left: 30rpx;padding: 10rpx 0;width: 192rpx;height: 652rpx;background-color: #EEEEEE;border: 1rpx dashed gray;
}.addVideo{margin-left: 30rpx;padding: 10rpx 0;width: 192rpx;height: 332rpx;background-color: #EEEEEE;border: 1rpx dashed gray;
}.addImage .chooseView, .addVideo .chooseView{width: 150rpx;height: 150rpx;background-color: #ffffff;margin: 10rpx 20rpx;border: 1px solid lightgray;text-align: center;line-height: 220rpx;border-radius: 5px;
}.addImage .chooseImv, .addVideo .chooseImv{width: 100rpx;height: 100rpx;
}.addImage .selected, .addVideo .selected{margin: 10rpx 20rpx;width: 150rpx;height:150rpx;position: relative;
}.addImage .selected .itemImage, .addVideo .selected .itemVideo{width: 100%;height: 100%;
}
.addImage .selected .closeImv, .addVideo .selected .closeImv{position: absolute;right: -15rpx;top: -15rpx;width: 40rpx;height:40rpx;
}.info{width: 500rpx;height: 150rpx;display: inline-block;position: absolute;margin-left: 30rpx;
}.subInfo{display: flex;
}.subInfo text{margin: 0 20rpx;
}.nameInput{width: 300rpx;height: 40rpx;line-height: 40rpx;border-bottom: 1rpx solid lightgray;padding: 0 20rpx;margin-bottom: 10rpx;
}.remarkInput{width: 330rpx;height: 80rpx;padding: 0 10rpx;box-shadow: 0 0 10rpx lightgray inset;
}

②整体.js文件代码

Page({data: {imgArr: [],chooseImageShow: true,videoArr: [],chooseVideoShow: true,},chooseImage: function () {var that = this;wx.chooseImage({count: 4 - that.data.imgArr.length,success: function (res) {if (res.tempFilePaths.count == 0) {return;}var imgArrNow = that.data.imgArr;imgArrNow = imgArrNow.concat(res.tempFilePaths);that.setData({imgArr: imgArrNow})that.chooseImageShow();}})},deleteImage: function (e) {var imgArr = this.data.imgArr;var itemIndex = e.currentTarget.dataset.id;imgArr.splice(itemIndex, 1);this.setData({imgArr: imgArr})this.chooseImageShow();},chooseImageShow: function () {if (this.data.imgArr.length >= 4) {this.setData({chooseImageShow: false})} else {this.setData({chooseImageShow: true})}},showImage: function (e) {var imgArr = this.data.imgArr;var itemIndex = e.currentTarget.dataset.id;wx.previewImage({current: imgArr[itemIndex],urls: imgArr})},chooseVideo: function () {var that = this;wx.chooseVideo({count: 2 - that.data.videoArr.length,success: function (res) {if (res.tempFilePath.count == 0) {return;}var videoArrNow = that.data.videoArr;videoArrNow = videoArrNow.concat(res.tempFilePath);that.setData({videoArr: videoArrNow})that.chooseVideoShow();}})},chooseVideoShow: function () {if (this.data.videoArr.length >= 2) {this.setData({chooseVideoShow: false})} else {this.setData({chooseVideoShow: true})}},deleteVideo: function (e) {var videoArr = this.data.videoArr;var itemIndex = e.currentTarget.dataset.id;videoArr.splice(itemIndex, 1);this.setData({videoArr: videoArr})this.chooseVideoShow();},showVideo: function (e) {var itemIndex = e.currentTarget.dataset.id;var videoContext = wx.createVideoContext(itemIndex.toString());videoContext.play();},
})

5. 小程序连接数据库

先购买腾讯云服务器和域名,按照教程登录云服务器(本人使用Windows 2012 R2 数据中心版 64位中文版)

再根据腾讯云官方文档 (https://cloud.tencent.com/document/product/213 )进行各种操作,如上传文件、安装配置IIS、安装PHP、安装搭建MySQL等操作。

PHP: Version 7.1.26; MySQL:Version 5.5.64;

在安装PHP时会打印phpinfo(),此时可以留意是否有mysqli,如下:

(若没有且PHP连接MySQL时出现“Call to undefined function mysqli_connect()”的错误时,可点击这里尝试该大神的方法)

接着在云服务器中下载Navicat for MySQL,把sql文件导入到Navicat

步骤一,打开Navicat,新建数据库,输入数据库名后按确定键

步骤二,右键点击新建数据库,选择 运行SQL文件 后,选择相应的文件后点击开始

小程序中通过wx.request()访问云服务器中的php,而php访问mysql,如下

click: function () {wx.request({url: 'http://xxxxxxxx/index.php',data: {username: 'xxx',password: 'xxx',database: 'xxx',},success: function (res) {console.log(res)},})}

云服务器的index.php 的代码如下 (编写PHP时,可参照官网http://php.net/manual/zh/book.mysqli.php 里面mysqli的API)

<?php
$username = $_GET['username'];
$password = $_GET['password'];
$database = $_GET['database'];$mysqli = new mysqli("localhost", $username, $password, $database);if (mysqli_connect_errno()) {printf("Connect failed: %s\n", mysqli_connect_error());exit();
}/* return name of current default database */
if ($result = $mysqli->query("SELECT DATABASE()")) {$row = $result->fetch_row();printf("this database is %s.\n", $row[0]);$result->close();
}$mysqli->close();
?>

6.存储多个对象的数组

Page({data: {imageArr: [], //存储图片的urlimageInfo: [], //分别存储各个图片的信息},addImage: function () {var imageArr= this.data.imageArr;for (var i in imageArr) {this.setData({['imageInfo[' + i + '].url']: imageArr[i],['imageInfo[' + i + '].name']: "",['imageInfo[' + i + '].remark']: ""})}},
})

console.log(this.data.imageInfo)打印出来的结果如下:

7. 上传图片等文件至服务器

小程序的js文件:

uploadFiles: function () {var that = this;for (var i = 0; i < that.data.imageArr.length; i++) {wx.uploadFile({url: 'http://XXXXXXXX/uploadFiles.php',filePath: that.data.imageArr[i],name: 'file',formData: {recordID: that.data.recordID,},success: function (res) {console.log(res)}})}}

服务器的PHP文件:

<?phpdate_default_timezone_set("Asia/Shanghai");$recordID = $_POST['recordID'];if(is_uploaded_file($_FILES['file']['tmp_name'])) {  $uploaded_file = $_FILES['file']['tmp_name'];  $user_path = '/upload/images/'.$recordID; if(!file_exists($user_path)) {  if(mkdir($user_path, 0777, true)){echo "Create Directory Successfully.";} else {echo "Fail to Create Directory.";}} $file_true_name = $_FILES['file']['name']; $move_to_file = $user_path."/".time().rand(1000,9999)."-".date("Y-m-d").substr($file_true_name,strrpos($file_true_name,"."));if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {  echo "Upload File Successfully ".date("Y-m-d H:i:sa"); } else {  echo "Fail to Upload File ".date("Y-m-d H:i:sa"); }} else {  echo "Fail to Upload File ".date("Y-m-d H:i:sa");  }
?>

8.服务器中的PHP文件传中文数据至数据库乱码 

$mysqli->query("SET NAMES utf8");

这行代码是正确的,但是我在操作过程中一直试不成功,最后找到了原因,那就是我数据库某些字段的编码是latin,所以要注意字段是否设置了utf-8

9.获取用户的手机号(巨坑)

首先,获取手机号的使用方法

需要将 <button> 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

所以当我们得到encryptedData后,要做的就是解密,然而官网给的方法里面埋了个大坑,先说一下官网给的是示例代码,下载后打开对应php语言文件夹得到3个php文件:demo.php 、 errorCode.php 、 wxBizDataCrypt.php

然而我根据示例只改动demo.php的情况下,代码总是报错,最终是一篇“小程序填坑:2018最新getPhoneNumber功能详解” 的文章提到了官网把重要的 pkcs7Encoder.php 给删除了,而恰好这个文档也是解析过程中也是必不可少的,所以我在服务器中添加了该文档,并对 wxBizDataCrypt.php 进行了相应的修改才得以成功获取用户手机号

10.无法访问上传的图片

简言之就是上传的时候是把图片先存放在临时文件夹中的,然后再把图片移到指定的文件夹中,虽然指定的文件夹设置了所有的的权限,但是这个临时文件夹的属性权限导致了这个图片的属性权限和指定文件夹的权限不一致,所以无权限访问。

11.video组件的controls属性无效

当我们把controls属性写成controls="false"时,"false"会被识别为false字符串,自动转化为布尔值是ture,所以需要加上双大括号才可识别布尔值为false,即controls="{{false}}"。

12.配置服务器信息中的request合法域名

在配置request合法域名为https://api.weixin.qq.com时,我们会发现会出现提示:“为保障帐号安全不可使用此域名地址”。

官方给出的解释是

小程序的开发者密码(AppSecret)是一个非常重要的字段,使用该密码可以调用小程序的所有后台接口。请不要将该字段放置在微信小程序的前端代码中,因为微信手机客户端容易被反编译并轻松获得Appsecret,造成重大的安全威胁。开发者应将Appsecret保存到后台服务器中,通过服务器使用Appsecert获取Accesstoken。

在编写代码过程中发现了安装的php版本中的php_openssl.dll这个模块没有开启,解决方法只需在php.ini上把“;extension=php_openssl.dll”改成“extension=php_openssl.dll”(即删掉前置的分号)。

13.服务器的数据库数据以Json格式接收和回传

接收代码:

<?php$username = $_GET['username'];$password = $_GET['password'];$database = $_GET['database'];$id = $_GET['id'];$profileInfo = $_GET['profileInfo'];$array = json_decode($profileInfo, TRUE);$mysqli = new mysqli("localhost", $username, $password, $database);$mysqli->query("SET NAMES utf8");if (mysqli_connect_errno()) {printf("Connect failed: %s\n", mysqli_connect_error());exit();}$sql = "UPDATE user SET name = '{$array['name']}', email = '{$array['email']}', qqNum = '{$array['qqNum']}', phoneNum = '{$array['phoneNum']}', gender = '{$array['gender']}', career = '{$array['career']}'  WHERE id = '{$id}'";if ($result = $mysqli->query($sql)){echo 'Update data successfully.'; }else {die('Error: ' . mysqli_error());}$mysqli->close();
?>

回传代码:

<?phpheader("Content-type:text/html;charset=utf-8");//字符编码设置  $username = $_GET['username'];$password = $_GET['password'];$database = $_GET['database'];$id = $_GET['id'];$mysqli = new mysqli("localhost", $username, $password, $database);$mysqli->query("SET NAMES utf8");if (mysqli_connect_errno()) {printf("Connect failed: %s\n", mysqli_connect_error());exit();}$sql = "SELECT count(*) FROM user WHERE id = '{$id}'";if ($result = $mysqli->query($sql)) {$row = $result->fetch_array(MYSQLI_NUM);if($row[0] == '0') {printf("%s\n", $row[0]);}else {$sql = "SELECT id, name, email, qqNum, phoneNum, gender, career FROM user WHERE id = '{$id}'";if($result = $mysqli->query($sql)){$jarr = array();$rows = $result->fetch_array(MYSQLI_ASSOC);$jobj = new stdclass();foreach($rows as $key => $value){$jobj -> $key = $value;}echo json_encode($jobj);}}$result->close();}else {die('Error: ' . mysqli_error());}$mysqli->close();
?>

14.获取数据库返回的json格式的数据长度

  getJsonLength: function(jsonData) {var length = 0;for (var temp in jsonData) {length++;}return length;}

15.从服务器获取的jsonObject需转成数组才能添加额外属性

  jsonObj2Array: function (jsonObj) {var array = [];for (var i = 0; i < this.getJsonLength(jsonObj); i++) {array[i] = jsonObj[i];}return array;}

假如不转成数组,则添加的属性会直接覆盖原有的jsonObject数据。

16.引入图表wxcharts.js

下载地址 https://gitee.com/Q_Augly/wx-charts.git

有关demo链接: https://blog.csdn.net/m0_37805167/article/details/75160063

17.左滑删除

参考文章:https://blog.csdn.net/mi_ni123/article/details/80021048

18.写过最长的SQL语句

值得一提的是GROUP_CONCAT(distinct ***)的意义:

GROUP_CONCAT是把某个字段合并成一个字符串,distinct的作用是去重。

SELECT event.name, subject.name as subject, GROUP_CONCAT(distinct adultertype.name) as adultertype, GROUP_CONCAT(distinct adulterlink.name) as adulterlink, GROUP_CONCAT(distinct motive.name) as motive, event.description
FROM ((((((event LEFT JOIN subject ON event.subject = subject.id) LEFT JOIN event2adultertype ON event.id = event2adultertype.event)LEFT JOIN adultertype ON event2adultertype.adultertype = adultertype.id) LEFT JOIN eventadulterlink ON event.id = eventadulterlink.event) LEFT JOIN adulterlink ON eventadulterlink.adulterlink = adulterlink.id)LEFT JOIN event2motive ON event.id = event2motive.event) LEFT JOIN motive ON event2motive.motive = motive.id
WHERE event.id = '4'
GROUP BY event.id;

参考资料

使用微信小程序对服务器上MySQL数据库进行操作

https://blog.csdn.net/weixin_43566648/article/details/85543230

PHP中出现Call to undefined function mysqli_connect()

https://blog.csdn.net/www121104115/article/details/75006164

微信小程序用setData修改数组或对象中的一个属性值

http://www.cnblogs.com/Mrrabbit/p/7680934.html

小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器

https://blog.csdn.net/csl125/article/details/79205143

小程序填坑:2018最新getPhoneNumber功能详解

https://blog.csdn.net/qq_38194393/article/details/81382108

解决PHP在Windows IIS 上传的图片无法访问的问题

https://www.cnblogs.com/huangtailang/p/4608175.html

PHP中把数据库查询结果输出为json格式

https://www.cnblogs.com/yiven/p/6491019.html

小程序wx-charts的项目实用

https://blog.csdn.net/m0_37938910/article/details/80744562

【微信小程序】滑动删除效果最全Demo

https://blog.csdn.net/mi_ni123/article/details/80021048

站在巨人的肩膀上,持续更新中!

开发微信小程序的过程记录相关推荐

  1. WordPress 网站开发“微信小程序“实战(二)

    原文链接:https://devework.com/wordpres...,转载请用明链注明来源,谢谢! 本文是"WordPress 开发微信小程序"系列的第二篇,本文记录的是开发 ...

  2. 开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

    在上篇随笔<基于微信小程序的系统开发准备工作>介绍了开发微信小程序的一些前期的架构设计.技术路线 .工具准备等方面内容,本篇随笔继续这个步骤,逐步介绍我们实际开发过程中对SSL协议的申请及 ...

  3. 利用WordPress REST API 开发微信小程序从入门到放弃

    自从我发布并开源WordPress版微信小程序以来,很多WordPress网站的站长问有关程序开发的问题,其实在文章:<用微信小程序连接WordPress网站>讲述过一些基本的要点,不过仍 ...

  4. 如何快速上手开发微信小程序?

    开发微信小程序其实很简单,对于初学者建议要首先了解一些前端开发的相关的知识(vue),比较熟悉html.css.JavaScript,还有就是要熟悉数据库的操作,基本的增删改查要会. 开发微信小程序快 ...

  5. 使用微信开发工具开发微信小程序(一)——小程序的代码构成与运行环境

    从零开始学习开发微信小程序,对比前端的页面开发,简单易上手. 接下来会持续更新,大家一起学习讨论. 小程序开发与前端网页开发的区别 运行环境不同:浏览器环境.微信环境 开发模式不同:网页开发,浏览器+ ...

  6. python开发微信小程序-微信小程序开发:python+sanic 实现小程序登录注册

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案. 微信小程 ...

  7. 使用牛刀云开发微信小程序(问题集锦)

    前不久,起步科技正式推出牛刀云1.0,我想这也应该是许多WeX5的忠诚追随者(我也算是其中之一吧)期望的结果了.使用牛刀云开发微信小程序,能够实现使用类似于WeX5的所见即所得组件积木搭建方式构建前端 ...

  8. 小程序 | 基于WAMP的新闻网小程序开发(体验全栈式开发微信小程序)

    之前学习微信小程序开发,主要是基于JS.WXML.WXSS的前端开发,对于后端技术不精的我也是使用了微信开发者工具中的云开发功能,但是今天突发奇想,特别想体验一下全栈式开发微信小程序,学习了一下基于W ...

  9. taro开发微信小程序-播放轨迹(十一)

    taro集成了地图后如何实现轨迹播放,暂停,停止呢?本身地图并不具备轨迹播放的能力,但是基于地图api可以实现轨迹播放的效果 思路如下: 1.获取所有的轨迹坐标点-最好是数组格式的json 2.定义一 ...

最新文章

  1. Python的零基础超详细讲解(第七天)-Python的数据的应用
  2. caffe python接口_ubuntu配置caffe的python接口pycaffe
  3. dbcc dbreindex server sql_DBCC DBREINDEX重建索引提高SQL Server性能
  4. 【leetcode】Single Number (Medium) ☆
  5. 26_多线程_第26天(Thread、线程创建、线程池)_讲义
  6. 有道单词本修改背景颜色
  7. 用c语言解三角函数公式大全初中,初中三角函数公式大全
  8. Ubuntu 下五笔拼音混合输入法
  9. 网友趣解: UCWEB手机浏览器产品说明书
  10. 2019-06-12-pintos 实验1
  11. SpringBoot项目的两种打包方式分析
  12. MySQL 所推荐的左右值法(毗邻目录法、预排序历遍法)
  13. Android 调用相机拍照,适配到Android 10,2021必看
  14. Goby 内测版1.9.314|代理全局状态切换、报告支持插件数据显示、新增47种 UDP 协议支持
  15. STM32cubeProgrammer连接设置说明
  16. SQL-正序倒序查询
  17. 微信中如何直接下载app
  18. 如何在Android的相机应用程序中添加Google相册快捷方式
  19. 查找某个导师(博导、硕导)所带学生的学位论文的步骤
  20. 红米note2 android版本是多少,红米Note2内存容量是多少?红米Note2运存ram是多少?...

热门文章

  1. Per-service mutual TLS authentication enablement
  2. 国产化系统下的浏览器开发
  3. 【Linux】CISI与RISC指令集
  4. 解决VBA自动分组中无法显示展开号(‘+’、‘-’)的情况
  5. 把计算机安装到手机桌面,如何将我的电脑图标添加到桌面上
  6. 请在微信客户端打开链接:火狐浏览器模拟微信浏览器内核教程 ,用chrome模拟微信浏览器访问需要OA…....
  7. (郁闷p2pover中)整理记录一
  8. c语言josephus问题程序设计,C语言编程Josephus问题
  9. java中反斜杠的用法_java反斜杠\的用法
  10. 广度+深度:岛屿的最大面积/岛屿数量