精华内容
下载资源
问答
  • 第一章 初识小程序 1.小程序不仅在商业上具备很大潜力,同时在技术上解决了一套代码多端运行和动态发版的两大痛点,用户在微信中扫一扫或搜一下即可打开具备原生体验的应用,这给开发者带来了很大的想象空间 2.一套...

    第一章 初识小程序

    1.小程序不仅在商业上具备很大潜力,同时在技术上解决了一套代码多端运行和动态发版的两大痛点,用户在微信中扫一扫或搜一下即可打开具备原生体验的应用,这给开发者带来了很大的想象空间

    2.一套代码,多端运行

    3.目前小程序名称一旦确定后便不可修改

    4.只有绑定的开发者才能使用开发者工具编写小程序,一个小程序最多可以绑定20个开发者,未认证的小程序最多可以绑定10个开发者

    5.只有填写了AppID的项目才能通过手机微信扫码进行真机测试

    6.编译器:sublime,atom,brackets

    第二章 小程序开发核心

    1.小程序框架将整个系统划分为视图层和逻辑层,视图层是由框架设计的标签语言WXML和用于描述WXML组件样式的WXSS组成,它们的关系就像HTML和CSS的关系
    2.在小程序中没有DOM的概念

    3.小程序中的视图层和逻辑层的交互是通过数据绑定和时间响应实现的,这是一种单向绑定的机制。

    这套机制需要首先将逻辑层和视图层的数据和事件进行绑定,当需要修改页面时,逻辑层只需要调用特定的setDate方法修改已绑定的数据,这时框架会自动触发WXML重新渲染,达到逻辑层对视图层的控制;当框架接收到用户交互操作时,会根据视图层绑定的事件,执行逻辑层对应的事件函数,达到逻辑层对视图层的响应

    4.框架首先会解析配置文件app.json,通过pages设置找到默认首页页面(pages第一个路径默认为首页),然后加载目录中.wxml、.wxss、.js、.json这四个文件进行页面渲染

    5.视图层和逻辑层之间相互通信的机制便是小程序的数据绑定和事件响应系统

    6.在一个完整的小程序中,文件主要分为框架程序主体文件和页面文件两大类

    框架主题文件是系统级别文件,一个项目只有一份,分别是app.json,app.js和app.wxss,他们分别控制小程序整体配置、逻辑和整体样式,小程序启动时只会执行一次。这3个文件必须放在项目根目录,且文件名必须是app,其中app.json和app.js是必须的

    页面文件,.wxml文件和.js文件是必须的,按照框架规定,同一个页面的这4个文件必须具有相同的路径和文件名,

    7.app.json:小程序公共设置,配置小程序全局设置

    app.js:小程序逻辑文件,主要用于注册小程序全局实例,编译时会和其他页面逻辑文件打包成一份JavaScript文件

    app.wxss:小程序公共样式表,对所有页面的布局文件都有效

    8.app.json是小程序配置文件,编写时要严格遵循json的格式规范。app.json在程序加载时加载,负责对小程序的全局配置,其配置项有:

    pages:设置页面路径,必填项

    window:设置默认页面的窗口表现

    tarBar:设置tab的表现

    networkTimeout:设置网络超时时间

    debug:设置是否开启debug模式,默认关闭

    9.pages配置,由页面“路径 + 文件名” 组成

    10.为了便于管理,建议文件名和目录名保持一致

    11.小程序中各种网络请求API的超时时间只能通过networkTimeout统一设置,不能再API中单独设置

    12.App()函数用于注册一个小程序,参数为一个Object对象,在这个参数对象中我们可以注册自定义方法和属性供全局使用。

    ​ App()函数必须在app.js中注册,且不能注册多个,其参数属性如下:

    onLaunch:声明周期函数,监听小程序初始化。当小程序初始化完成时,就会触发onLaunch,onLoaunch事件全局只会触发一次

    onShow:生命周期函数,监听小程序显示。当小程序启动,或者从后台进入前台显示时都会触发onShow

    onHide:生命周期函数,监听小程序隐藏。当小程序从前台进入后台会触发

    13.只有当小程序进入后台一定时间,或者系统资源占用过高,才会被真正销毁

    14.页面逻辑文件主要功能有:设置初始化数据,注册当前页面生命周期函数,注册事件处理函数等。

    15.在小程序中,每个逻辑文件有独立的作用域,并具备模块化能力

    16.在WXML中编写一些HTML标签或自定义标签仍然会被正常解析,这会给开发者造成一种小程序能直接支持HTML标签的误解。这是因为微信开发者工具内核是浏览器内核,同时小程序框架并没对WXML中的标签和WXSS中的内容进行强验证,所以HTML和CSS能直接被解析,但这种不合法的WXML在手机端微信中是不能正常显示的

    17.开发过程中我们一定要拿真机进行测试,保证程序能正常运行

    18.WXML具有数据绑定(Mustache语法,双大括号)、列表渲染、条件渲染、模板、事件等能力

    19.组件属性为boolean类型时,不要直接写checked=“false”,这样checked的值是一个false的字符串,转成boolean类型后代表为true,这种情况一定要使用关键字输出:checked="{{false}}"

    20.wx:if在条件第一次为真时才局部渲染,hidden 组件始终会被渲染

    ​ 由于wx:if会触发框架局部渲染过程,在频繁切换状态的场景中,会产生更大的消耗,这时尽量使用hidden;在运行时条件变动不大的场景中我们使用wx:if,这样能保证页面有更高效的渲染,而不用把所有组件都渲染出来

    21.通过对比发现,import更适合引用模板定义文件,include更适合引入组件文件

    22.小程序目前不支持直接引入node_modules,开发者需要使用node_modules时建议拷贝出相关代码到小程序目录中

    23.通过模块化我们能实现代码真正的隔离,可以多人并行开发,降低大型项目管理难度,这对前端工程化具有很大促进作用

    24.微信小程序逻辑代码运行在三端:iOS,Android和用于调试的开发者工具,这三端是各自不同的三个解析引擎

    第三章 布局

    1.开发者工具功能“开启上传代码时样式文件自动补全”,否则flex布局会存在不同终端兼容性问题

    2.一个块级元素的元素框与其父元素的width相同,块级元素的width+marginLeft+marginRight+paddingLeft+paddingRight刚好等于父级元素内容区宽度,显示时默认撑满父元素内容区

    3.当设置块级元素宽度为100%时,如果当前块级元素存在padding,margin会导致块级元素溢出父元素

    4.当设置元素clear时,可以确保当前元素的左边、右边或左右两边同时不能出现浮动的元素

    5.父元素虽然会忽略浮动元素(如浮动高度示例中产生的坍塌),但是不会忽略其他元素(包括清除浮动的元素),而清除浮动的元素总是在浮动元素下方,所以在显示时视觉上父元素就把所有元素都包含进去了,无论非浮动元素在哪里,父元素边框都包含了非浮动元素。

    利用这个特性,把清除浮动的高度设置为0使其看不见,这时父元素仍然会包裹它,这样就能防止浮动元素高度坍塌,网上利用after伪属性清除浮动就是这个道理

    第四章 组件

    1.与HTML元素一样,一个组件是指从组件开始标签到结束标签的所有代码,由于组件可能会被转译

    为不同端对应的代码,所以在页面创建过程中,不能使用小程序组件标签以外的标签。

    2.组件的定义:

    ①组件是视图层的基本组成单元

    ②组件自带一些功能与微信风格的样式

    ③一个组件通常包括开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之内

    按类型可以将组件划分为七大类:视图容器,基础内容,表单,导航,多媒体,地图,画布

    3.属性只能用在开始标签或单个自闭合标签上,不能用于结束标签

    4.组件的属性类型:Boolean,Number,String,Array,Object,EventHandler(事件处理函数名),Any(任意属性)

    5.在前端项目中我们常使用DIV+CSS进行页面布局,其中

    没有任何语义和功能,仅作为容器元素存在,在小程序中,有一套类似div的容器组件,那就是,和

    6.view具备一套关于点击行为的属性:

    hover:是否启动点击态,默认值为false

    hover-class:指定按下去的样式。当hover-class="none"时,没有点击态效果,默认值为none

    hover-start-time:按住后多久出现点击态,单位毫秒,默认值为50

    hover-stay-time:手指松开后点击态保留时间,单位毫秒,默认值为400

    <view style="background-color:red; flex-grow:1;height:80rpx;"></view>
    <view style="display:flex;height:400rpx">
    

    8.<scroll-view> ,scroll-x:允许横向滚动,默认为false,scroll-y允许纵向滚动,默认为false,

    9.需要注意的是,在使用纵向滚动时,需要先给<scroll-view.>一个固定高度

    10.一个完整的滑动视图组件由<swiper>和<swiper-item>两个标签组成的,它们不能单独使用,一个<swiper>中只能放置一个或多个<swiper-item>,放置其他内容点会被删除,<swiper-item>内部能放置任何组件,默认宽高自动设置为100%,、<swiper-item/>组件作为容器没有任何特殊属性

    基础组件:

    1. <icon>,是页面中非常常见的组件,它通常用于表示状态,起到引导作用。

    12.text组件

    ​ 主要用于文本内容的展示,类似HTML中p标签,在小程序中,只有text节点内部的内容能被长按选中,大家在展示文本的时候一定要根据这个特性注意场景的使用。text是行内元素,除了组件共同属性外并没有提供其他属性,文本中的内容支持转义字符"",text组件内只支持text嵌套

    13.progress组件,用于显示进度状态,比如资源加载、用户资料完成度、媒体资源播放进度等

    表单组件:

    14.表单是应用中获取用户输入的重要手段,它对于系统极其重要,用户在应用中输入的大部分内容都是在表单元素中完成的,

    15.radio组件

    ​ 适用于可用有效数据不多的情况,小程序中单选框是由<radio-group>(单向选择器)和<radio>(单项项目)两个组件组合而成的,一个包含多个<radio/>的<radio-group/>表示一组单选框,在同一组单选项的<radio/>是互斥的,当一个按钮被选中,之前选中的按钮就变为非选中。当需要用户在待选项中选择唯一的答案时,就需要使用到单项框

    16.checkbox组件

    ​ 与单选框一样,小程序中的复选也是由<checkbox-group/>(多项选择器)和<checkbox/>(多项项目)两个组件组合而成。一个包含多个<checkbox/>的<checkbox-group/>表示一组多选项,一组多选型允许在待选项中选中一项以上的选项

    17.整体来看复选框和单选框的使用方式基本一致,最大的区别在于交互上单选框在同一组单选项中只能选中一个,而复选框可以选中多个;选中状态切换时change方法传入的参数数值一个是传入单值,一个是传入数组。

    18.switch组件

    ​ <switch/>是一个可以在两种状态切换的开关选择器,是一个单独控件

    ​ 在小程序中当<switch/>的type属性值为checkbox时,它的UI表现和<checkbox/>非常接近

    19.label组件

    ​ 在radio和checkbox中,点击文案时不能选中对应的单选框或复选框,这是我们可以利用<label/>改进表单组件的可用性,通过绑定for属性让用户点击<label/>时触发对应的控件,目前可以绑定的控件有<button/>,<checkbox/>,<radio/>,<switch/>

    20.小程序中label的触发规则有两种

    ​ ①将控件放在标签内。当用户点击时触发label中第一个控件

    ​ ②设置label的for属性,当用户点击时触发for属性对应的控件。for属性优先级高于内部控件

    ​ label只有一个for属性:绑定控件的id

    21.避免交互体验混乱,一个label尽量只包裹一个组件

    22.slider组件

    ​ 滑动选择器是一种在移动端常用的交互组件,亮度调节工具

    ​ 滑动选择器一般有水平和垂直两种,小程序中只提供了水平的形式,滑动到最左边是最小值,滑动到右边是最大值

    23.picker组件

    ​ <picker/>可以在屏幕底部弹出一个窗口,供用户在所提供的选择项中选择一个

    ​ 普通选择器,时间选择器和日期选择器

    24.picker-view组件

    ​ 多种形态选择器 ,<picker-view/>自定义滚动选择器

    25.input组件

    ​ <input/>是单行输入框,用于收集用户信息。属性很多,大部分和HTML的Iinput类似

    26.textarea组件

    ​ 多行输入框,与HTML中多行输入框不一样的是,小程序中textarea是一个自闭合标签,它的值需要赋值给value属性,而不是被标签包裹

    27.button组件

    通常在一个小程序中一个按钮至少有3中状态:默认点击(default),建议点击(primary),谨慎点击(warn)

    28.form组件

    ​ 用于嵌套其他组件,使之形成表单

    29.导航组件

    ​ <navigator/>是小程序中的页面链接,其作用和HTML中超链接标签一样,主要控制页面的跳转

    30.媒体组件 image

    ​ 小程序中的image除了可以显示图片外,还提供了图片的裁剪,缩放模式属性,这大大丰富了image的显示功能。默认宽度为300px,默认高度为225px

    31.audio

    ​ 样式像朋友圈分享歌曲的样式,播放等功能需要配合API实现

    32.地图组件

    ​ map主要负责展示性的功能,目前地图具备绘制图表,路线,半径等功能,在<scroll-view/>中不能使用<map/>组件

    33.画布组件

    ​ <canvas/>主要用于绘制图形,在页面上放置一个canvas,就相当于在页面设置了一块“画布”,可以在其中进行图形绘制,仅仅是图形容器

    34.客服会话

    ​ <contact-button/>用于在页面上显示一个客服会话按钮,用户点击后会进入客服会话



    第五章 API

    1.运用组件可以完成很多需要的UI界面,但小程序的一些功能就要依赖框架提供的API来完成

    2.小程序提供的API,包括网络、媒体、文件、数据缓存、位置、设备、界面、开放接口8大类,这些API由微信本身提供,通过逻辑层 JS代码进行调用

    3.微信API按命名规则可分为两种:

    ​ ①以wx.oon开头的API,如:wx.onSockectOpen,wx.onBackgroundAudioPlau(),wx.on-CompassChange()等,均代表监听某个事件发生的API接口,这类接口一般来说参数均为一个callback回调函数,当该事件触发时,会回调callback函数

    ​ ②其他不以wx.on开头的API,如:wx.request,wx.uploadFile,wx.chooseImage,这类接口如果没有特殊约定,通常都接受一个Object对象作为参数,在Object中可以指定success,fail,complete来接受接口调用接过,这三个回调函数在有些API中具有返回值,有些没有

    4.网络

    每个微信小程序需要事先设置一个通信域名,小程序可以跟指定的域名进行网络通信。包括不同HTTPS请求(wx.request),WebSocket通信(wx.connectSocket),上传文件(wx.uploadFile)和下载文件(wx.downloadFile)。设置通信域名需要登录小程序“后台->设置->开发设置,”在服务器配置中添加受信任的域

    5.wx.request(Object)

    ​ request用于发起HTTPS请求,默认超时时间和最大超时时间都是60秒。在小程序中只能使用HTTPS请求不能使用HTTP请求,一个微信小程序,同时只能有5个网络请求连接。

    ​ data数据最终发送给服务器的数据是String类型,如果传入的data不是String类型,则会被转化成String,

    6.wx.uploadFile(Object)

    ​ 如需提交带有本地资源的数据,便需要调用此接口将本地资源上传到指定服务器。调用这个uploadFile时,客户端会向服务端发起一个HTTP POST请求,header中Content-Type为multipart/form-data。上传文件最大并发限制为10个,默认超时时间和最大超时时间都是60秒

    7.wx.downloadFile(Object)

    从服务端下载资源到本地。调用API后,客户端直接发起一个HTTP GET请求,把文件下载到本地并返回文件的本地临时路径,临时文件在小程序本次启动期间可以正常使用,如需持久保存需要主动调用wx.saveFile进行保存

    8.WebSocket

    上节中介绍的网络通信方法都是通过客户端主动向服务端发起请求,由服务端相应返回数据来达到通信的目的,这种方式有个缺点,不能实现服务端主动向客户端推送信息。采用这种短连接方式实现客户端和服务端之间的即时通信技术只能使用轮询,即在特定时间间隔(如每1秒),由客户端向服务端发起请求,然后由服务端返回最新的数据。这种方式需要客户端要不断的向服务端发送请求,在处理即时通信时,这种方式既浪费性能又占带宽。面对这种情况,在需要即时通信时,我们可以利用小程序提供的WebSocket相关API创建WebSocket,实现长连接达到即时通信的目的。长连接服务端比短连接更耗资源,在技术选项上要慎重

    9.wx.connectSocket(Object)

    创建一个WebSocket连接。一个小程序 同时只能有一个WebSocket连接,创建新连接时,如果当前已存在一个WebSocket连接,会自动关闭该连接,并重新创建一个新的WebSocket连接,创建连接时默认和最大超时时间都是60秒

    10.wx.chooseImage

    ​ 从本地相册选择图片或者使用相机照片。拍照时产生的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需要主动调用wx.saveFile,这样才能保证小程序下次启动时能访问到

    11.wx.startRecord

    ​ 开始录音。当主动调用wx.stopRecord,或者录音超过1分钟时自动结束录音,返回录音文件的临时文件路径当用户离开小程序时,此接口无法调用

    12.wx.playVoice

    ​ 开始播放语言,同时只允许一个语音文件播放,如果前一个语音文件还没播放完,将中断前一个语音播放

    13.wx.saveFile

    ​ 保存文件到本地,本地文件存储大小限制为10MB

    14.数据缓存

    ​ 每个小程序都可以有自己的本地缓存,local Storage是永久存储的,本地缓存最大为10MB,数据操作API分为同步和异步两种

    15.将数据存在本地缓存指定的key中, 会覆盖原来该key对应的内容

    ​ wx.setStorage(Object) 异步接口 wx.setStorageSync(KEY,DATA) 同步接口

    16.wx.getStorage 从本地缓存中异步获取指定key对应的内容

    17.wx.getStorageinfo 异步获取当前storage的相关信息

    18.wx.removeStorage 根据key值异步删除本地数据

    19.获取位置

    ​ 在国际上,坐标体系有多套标准,小程序支持WGS84标准和GCj02标准,WGS84是地球坐标系🌏,国际上通用的坐标系。设备一般包括的GPS芯片或者北斗芯片所获取的经纬度为WGS84地理坐标系。GCj02坐标系为火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统,它是由WGS84坐标系经加密后的坐标系, 它是在小程序中,查看位置需要使用GCj02标准坐标

    20.wx.getLocation用于获取当前的地理位置,速度,需要用户开启定位功能,当用户离开小程序后,此接口无法调用;当用户点击“显示在聊天顶部”时,此接口可继续调用

    21.wx.chooseLocation用于打开地图选择位置,用户选中后返回选中信息

    22.wx.createMapContext用于创建并返回map上下文mapContext对象,map-Context通过,mapId根一个<map/>组件绑定,通过它可以操作对应的<map/>组件

    23.wx.getSystemInfo 异步获取系统信息

    24.wx.makePhoneCall用于调用手机拨打电话功能

    25.scanCode调起客户端扫码界面,扫码成功后返回对应结果

    26.界面-交互反馈 wx.showToast 显示信息提示框 wx.showModal 显示模拟弹窗

    27.wx.showActionSheet 显示操作菜单

    28.设置导航条

    ​ wx.setNavigationBarTitle 动态设置当前页面的标题

    ​ wx.showNavigationBarLoading 在当前页面显示导航栏加载动画

    ​ wx.hideNavigationBarLoading 隐藏导航条加载动画

    29.导航

    ​ wx.navigateTo 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面,小程序中页面路径最多5层

    ​ wx.redirectTo 关闭当前页面,跳转到应用内的某个页面

    ​ wx.switchTab 跳转到tarBar页面,并关闭其他所有非tarBar页面

    ​ wx.navigateBack 关闭当前页面,返回上一页面或多级页面

    30.动画

    ​ wx.createAnimation 用于创建一个动画实例animation。可以调用动画实例的方法来描述动画,最后通过动画实例的export方法到处动画数据,传递给组件animation属性,每此调用exports方法会清掉之前的动画操作

    31.动画描述方法按类型可分为样式,旋转,缩放,偏移,倾斜,矩阵变形

    32.调用动画操作方法后要调用step()来表示一组动画完成,可以在一组动画中调用任意多个动画方法,一组动画中的多有动画会同时开始,一组动画完成后才会进行下一组动画,step可以传入一个跟wx.createAnimation()一样的配置参数,用于指定当前组动画的配置

    33.路径

    ​ 路径绘制并不会在画布上绘制形状,而是创建一个线条路径,创建的路劲可被stroke()绘制线条,也可被fill()填充区域,绘制路径开始时需要调用beginPath()方法,结束时需要调用closePath()方法,上文rect()方法可认为是绘制矩形路径的一个快捷方法,通过路径方法组合,我们可以绘制任何形状图形

    34.wx.getUserInfo 获取用户信息,需要首先调用wx.login接口

    ​ wx.requestPayment 用于发起微信支付

    35.access_token是全局唯一的接口调用凭证,调用很多接口都需要使用access_token,access_token存储至少需要512个字符空间,

    36.排重

    展开全文
  • 安卓程序开发入门

    2021-06-06 05:02:56
    您可能感兴趣的话题:安卓程序开发入门核心提示:本教程为大家介绍采用Eclipse软件来编写安卓Hello,World程序。创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Eclipse软件版本在3.2或3.3,你就可以...

    您可能感兴趣的话题:

    安卓程序开发入门

    核心提示:本教程为大家介绍采用Eclipse软件来编写安卓Hello,World程序。

    创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Eclipse软件版本在3.2或3.3,你就可以开始开发了。

    首先, 看一下要创建"Hello, World"程序从高级层面上有哪些步骤:

    1, 通过 File -> New -> Project 菜单,建立新项目"Android Project"

    2, 填写新项目各种参数。

    3, 编辑自动生成的代码模板。

    仅此而已,我们通过下面的详细说明来完成每个步骤。

    1、创建一个新的Android项目

    启动Eclipse, 选择 File -> New -> Project 菜单, 如果你安装好了Android的Eclipse插件,你将会在弹出的对话框中看到"Android Project" 的选项。

    bc399a169d6f0f2d6cbd97d93113bf4c.png

    选择“Android Project”,点击 Next 按钮。

    2、填写项目的细节参数

    下面的对话框需要你输入与项目有关的参数:

    03ee99883c12ff405a2693cf513c21f5.png

    这个表格中详细介绍了每个参数的含义:

    Project Name: 包含这个项目的文件夹的名称。

    Package Name: 包名,遵循JAVA规范,用包名来区分不同的类是很重要的,例子中用到的是"com.google.android",你应该按照你的计划起一个有别于这个的路径的名称。

    Activity Name: 这是项目的主类名,这个类将会是Android的Activity类的子类。一个Activity类是一个简单的启动程序和控制程序的类。它可以根据需要创建界面,但不是必须的。

    Application Name: 一个易读的标题在你的应用程序上。

    在"选择栏"的"Use default location" 选项,允许你选择一个已存在的项目。

    3,编辑自动生成的代码。

    当项目创建后,你刚才创建的HelloAndroid就会是包含下面的代码.

    public class HelloAndroid extends Activity

    {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle icicle)

    {

    super.onCreate(icicle);

    setContentView(R.layout.main);

    }

    }

    下面我们开始修改它

    [构建界面]

    当一个项目建立好以后,最直接的效果,就是在屏幕上显示一些文本,下面是完成后的代码,稍后我们在逐行解释。

    代码

    public class HelloAndroid extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle icicle) {

    super.onCreate(icicle);

    TextView tv = new TextView(this);

    tv.setText("Hello, Android");

    setContentView(tv);

    }

    }

    注意你还需要添加 import android.widget.TextView; 在代码开端处。

    在Android程序中, 用户界面是由叫做Views类来组织的。 一个View可以简单理解为可以绘制的对象,像选择按钮,一个动画,或者一个文本标签(这个程序中),这个显示文本标签的View子类叫做TextView.

    如何构造一个TextView:

    TexiView tv = new TextView(this);

    TextView的构造参数是Android程序的Context实例, Context可以控制系统调用, 它提供了诸如资源解析, 访问数据库等等。Activity类继承自Context类,因为我们的HelloAndroid 是Activity的子类, 所以它也是一个Context类,所以我们能用"this"在TextView构造中。

    当我们构造完TextView后,我们需要告诉它显示什么:

    tv.setText("Hello, Android");

    这个步骤很简单,当我们完成了这些步骤以后,最后要把TextView显示在屏幕上。

    setContentView(tv);

    Activity的setContentView()方法指示出系统要用哪个View作为Activity的界面, 如果一个Activity类没有执行这个方法,将会没有界面并且显示白屏。在这个程序中,我们要显示文本,所以我们传入已创建好的TextView。

    好了,程序代码已经写好,下面看看运行效果。

    运行代码: Hello, Android

    使用Android的Eclipse插件就可以很轻松的运行你的程序,选择Run -> Open Run Dialog。你将会看到下面的对话框

    0778ae7283cbdb5a4e0cbb8b4bcbd5b4.png

    下一步, 高亮"Android Application" 标签, 然后按下左上角的图标(就是像一片纸带个小星星那个), 或者直接双击 "Android Application" 标签, 你将会看到一个新的运行项目,名为"New_configuration".

    9a8e7130a45914eec5a71218a16c6be9.png

    取一个可以表意的名称,比如"Hello, Android", 然后通过Browser按钮选取你的项目(如果你有很多个项目在Eclipse中,确保你选择要运行的项目), 然后插件会自动搜索在你的项目中的Activity类并且将所有找到的添加在"Activity"标签的下拉列表中。 我们只有"Hello, Android"一个项目,所以它会作为默认选择。

    点击"Apply" 按钮,下图

    13d0041a6048fbe5ac2f1be91fff527b.png

    到这里,已经完成了,你只需要点击"Run"按钮,然后 Android的模拟器将会启动,你的应用程序就会被显示出来。

    b78c6886c1e15bd08cc0467f80c109e8.png

    展开全文
  • 零基础入门小程序开发云函数

    写在前面

    1,讲解视频

    https://edu.csdn.net/course/detail/26572

    2,配套笔记

    配套笔记会在csdn上免费给到大家,欢迎关注,笔记会持续更新。
    https://blog.csdn.net/qiushi_1990

    3,支持石头哥😊

    3-1,源码和配套资源获取

    目前源码和配套的一些资源暂时不免费,如果有需要的同学可以私聊石头哥,拿米来换。

    3-2,笔记电子书

    笔记我也有整理一套电子书,大家也可以私聊石头哥获取电子书版的配套笔记。电子书笔记方便后期查询知识点。

    4,问题解答(●’◡’●)

    另外石头哥提供配套解答服务。当然了,知识付费时代石头哥解答是要米的,毕竟石头哥精力有限,石头哥也是要吃面包的。石头哥有推出包月,包年解答服务。你在学习过程中有任何问题,或者工作中遇到任何编程问题,都可以来找石头哥
    石头哥目前可以解答如下问题

    • 小程序方面的问题
    • 云开发方面的问题
    • Java,springboot,Javaweb方面的问题
    • 毕设方面的问题
    • 安卓app开发方面的问题
    • html+css+JavaScript方面的问题
    • 前端开发的问题
    • 后端开发的问题
    • 面试找工作方面的问题

    一,认识小程序云开发

    1-1,云开发简介

    • 小程序·云开发是微信团队联合腾讯云推出的专业的小程序开发服务。

    • 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等,并且原生打通微信开放能力。

    • 开发者无需搭建服务器,可免鉴权直接使用平台提供的API进行业务开发
      小程序

    • 云开发又简称tcb,是微信官方给我们提供的基于腾讯云的云服务器。目前云开发包含:云数据库,云函数,云存储,云调用。后面章节会具体给大家讲解这几个。

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html

    1-2,云开发和传统服务器对比

    云开发相对于传统服务器的优势如下表

    通过上面的对比,我们可以看出,如果你想快速创建一个小程序的后台,用云开发是不错的选择。

    二,微信开发者工具的安装与使用

    工欲善其事必先利其器,我们在开发小程序之前,首先需要安装小程序开发者工具,今天就来教大家安装小程序开发者工具。

    2-1,其实很简单,只需要进入小程序官网,然后点击工具,如下图所示。



    当然了,也可以直接通过下面链接去下载
    https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

    2-2,下载安装包如下


    不管你是window还是mac电脑,只需要双击安装包实现安装即可。

    等待安装即可

    安装完成

    2-3,进入开发者工具


    第一次进入时,如下

    点击上图的加号,我们来创建一个新项目

    完成上图的配置后,点击新建。即可创建项目。创建好以后的项目如下图所示。

    这样我们就完成了小程序开发者工具的安装了,后面我们就可以开始小程序的代码编写了。

    三,注册小程序

    我们前面虽然可以用测试号创建小程序,但是测试号有很多功能会受限,比如我们接下来要讲的云开发,必须是注册小程序后才可以使用,所以今天我们就来讲讲小程序的注册.

    其实官方给的注册步骤很详细了


    官方注册文档:https://developers.weixin.qq.com/miniprogram/introduction/

    微信小程序注册地址:https://mp.weixin.qq.com/
    进去以后点击立即注册

    进入注册页面时,跟着提示一步步来就可以了

    注意点:

    • 如果只是学习的话,注册个人小程序即可.
    • 如果想商用,想使用微信支付,取用户手机号等复杂功能,可以注册企业小程序,不过企业小程序必须有营业执照才可以注册
    • 一个邮箱只能注册一个小程序
    • 一个身份证可以注册5个,个人小程序
    • 一个企业的营业执照可以注册50个企业小程序

    四,云开发环境的创建与初始化

    今天我们就来正式的创建自己的第一个云开发项目,在创建云开发之前,有下面几个注意事项

    • 1,必须注册小程序后才可以开通云开发
    • 2,一个小程序可以创建两个云开发环境

    4-1,创建一个初始项目

    我们要开通云开发服务,必须先要进入小程序开发者工具才可以。最新版的开发者工具在创建项目时又多了一个模板选择,如果你用的是最新版的开发者工具,模板选择里就选择不使用模板即可。

    最新版的开发工具不使用模板

    如果你用的是最新版的开发者工具,创建项目时会多一个模板选择,这里一定要记得选择不使用模板。

    和创建普通小程序一样,如上图所示,需要注意的就是这里必须要填写自己的appid,不可以用测试号. appid的获取如下图所示.

    关于appid

    如果你不使用自己的appid创建项目,就会出现下面的问题,所以一定要先去注册一个小程序,然后用自己的appid。

    由于云开发官方更新的太快,有些同学可能会遇到下面这样的问题


    没有 不使用云服务 选型。这个时候该怎么办呢。石头哥也已经更新课程,给大家提供的解决方案。

    4-2,没有“不使用云服务”选型解决方案(选看)

    如果你出现上面的问题,再看这节,如果没出现这样的问题,直接跳过就行。

    我在配套资料里为大家准备了一个空白项目的模板。大家只需要把这个模板下载到桌面,并解压。

    然后点击导入,把项目导入即可。

    然后如下所示,记得appid换成你自己的。

    4-3,开通云开发

    • 1,点击下图箭头所示,如果你第一步创建项目时,没有使用自己的appid,这里不会有下图箭头所示的云朵.
    • 2,给云开发环境取名

      等待创建

      创建成功
    • 3,获取云开发环境id

    4-4,初始化云开发环境(***重要)

    在app.js里写入环境id,注意这里要用你自己的云开发环境id

    • 初始化云开发环境前,先去云开发控制台,拿到云开发环境id,如下图

      这里的环境id建议直接复制,不要手写,很容易写错。

    • 拿到环境id以后,就去app.js里做云开发环境初始化,如下

    用时候云开发创建好以后,初始化可能需要一点时间,所以如果这里初始化有报错,记得关闭开发者工具,等几分钟再重新打开即可.

    五,云开发~云数据库

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/init.html

    5-1,在数据库里新建集合(数据表)

    我们这里以新建一个商品列表为例

    5-2,数据库权限管理

    要想让用户查询到我们创建的商品数据,需要把权限改为所有用户可读

    5-3,数据库的增删改查

    5-3-1,查询 get()

    • 传统写法
    • ES6简洁写法

      推荐第二种写法

    5-3-2,条件查询 where()

    5-3-3,查询单条数据doc()

    doc是用来查询单条数据的。比如商品详情页。
    doc里面用到的参数就是我们数据里的_id字段

    5-3-4,添加数据 add()

    通过add可以实现数据的添加,

    5-3-5,更新数据update()

    修改数据库里已存在的数据,结合doc进行修改单条数据

    5-3-6,删除数据remove()

    删除数据,结合doc删除单条数据

    5-4,增删改查综合案例

    • 1,能查看商品列表
    • 2,更动态添加商品
    • 3,能进入商品详情页
    • 4,能删除某个商品
    • 5,能修改某个商品的价格

    5-4-1 列表跳详情 data-

    • 1,在wxml里定义data- 要绑定的数据
    • 2, 在js页面里的点击方法里拿到绑定的数据
    • 比如打印结果如下
      在这里插入图片描述

    5-4-2,列表跳详情并携带商品id

    • 1,列表跳页到详情页
    • 2,拿到列表跳页时携带的id数据

    5-4-3,查询商品列表

    5-4-4,添加商品并刷新商品列表

    5-4-5,更新商品数据

    用户输入新价格,调用update方法进行更新数据

    我们更新成功的时候,会有如下所示的日志打印。

    只有stats里的updated是1的时候,才代表成功的更新了一条数据。
    如果这条商品不是你创建的,当你对这条商品做更新操作时,打印的updated就是0。

    这个时候代表没有更新成功。这是因为操作时的权限问题,要解决这个问题,就要借助云函数了,这里我们先放在这里,在后面云函数章节会做具体讲解。

    5-4-6,弹窗提示确认是否删除

    用户删除数据是一个危险操作,所以操作之前最好给用户一个友好提示。
    官方弹窗文档:https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showModal.html

    5-4-7,删除商品

    5-4-8,更新和删除时的权限问题

    如果这条商品不是你创建的,当你对这条商品做删除或者更新操作时,虽然也会返回成功,但是可以看到我们更新或者删除的条数是0。

    其实这个时候也意味着没有更新或者删除成功,这里是因为操作权限的问题,因为这条数据不是你创建的。所以你只能对这条数据做查询操作,而不能做修改和删除操作。要想解决这个问题,就要借助云函数了。后面云函数讲解的部分,我会做具体讲解的。

    我们还是先接着学习数据库操作的高级操作

    5-6,常用快捷键

    我们在开发时为了提高代码编写效率,通常会使用一些快捷键。我们小程序开发工具里常用的快捷键如下。
    设置—》快捷键设置
    在这里插入图片描述
    然后点击如下快捷键即可查看所有的快捷键

    如果感觉默认的快捷键不喜欢,可以自己重新设置快捷键。由于自带的快捷比较多,我这里不一一列举了,我把一些常用的快捷键拿出来给大家大致讲一讲,我这里以window电脑为例,如果你mac电脑,可以自己去看下开发者工具默认的快捷键。多看几遍把常用的记住就行了。

    快捷键组合描述
    Ctrl+a全选
    Ctrl+c复制选中内容
    Ctrl+v粘贴复制的内容
    Ctrl+z撤销当前编辑
    Ctrl+s保存并编译项目
    Ctrl+b重新编译项目
    Ctrl+x截切选中的内容
    Ctrl+/添加注释
    Ctrl+Shift+k删除当前行
    Ctrl+Shift+f全局搜索
    Ctrl+f当前页面内搜索
    Ctrl+Shift+h全局搜索并替换文本
    Ctrl+h当前页面内搜索并替换文本
    Shift+Alt+F格式化代码
    Shift+Alt+⬆向上复制当前行
    Shift+Alt+⬇向下复制当前行
    Alt+⬆把当前行向上移动一行
    Alt+⬇把当前行向下移动一行

    有的电脑上快捷键可能会有细微差距,以开发者工具默认自带的快捷键为准。

    5-7,数据库排序orderBy

    orderBy方法在做排序的时候,接受两个参数

    • 1,根据那个字段排序
    • 2,排序规则(升序或者降序)。升序用asc,降序用desc

    如我们根据商品价格从低到高升序排列

    如我们根据商品价格从高到低降序排列

    5-8,返回指定条数的数据limit

    limit用来指定查询结果集数量上限,比如我们有100条数据,只想返回前20条,我们可以通过limit(20)来指定只返回20条数据。

    例如,只返回3条数据的写法如下

    • 注意:limit 在小程序端默认及最大上限为 20,在云函数端默认及最大上限为 1000

    5-9,分页方法skip

    skip指定查询返回结果时从指定序列后的结果开始返回,常用于分页。比如我们有100条数据,想从第10条开始返回数据,可以通过skip(10)来实现

    • skip结合我们上面学的limit方法可以实现分页效果

    比如我们有100条数据,每次返回20条数据。那么就可以分5页返回。

    • 第1页 limit(20).skip(0)
    • 第2页 limit(20).skip(20)
    • 第3页 limit(20).skip(40)
    • 第4页 limit(20).skip(60)
    • 第5页 limit(20).skip(80)

    5-10,Command数据库操作符

    我门上面学完了数据库的增删改查,但是这些都是最基础最简单的操作,如果我们想实现复杂的数据查询操作,该怎么办呢
    比如

    • 查询价格大于100的商品?
    • 查询年龄小于18岁的学生?
    • 如何同时修改多条数据?
    • 如何同时删除多条数据?

    我们如果想实现上面这些复杂的操作,就需要用到数据库里的 Command数据库操作符,就是下面这位

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Command.html

    5-10-1,gt查询大于指定值的数据

    比如查询价格大于5的所有商品

    5-10-2,gte查询大于等于指定值的数据

    比如查询大于等于5元的商品

    5-10-3,lt查询小于指定数值的数据

    比如查询价格小于5的所有商品

    5-10-4,lte查询小于等于指定数值的数据

    比如查询价格小于等于5元的所有商品

    5-10-5,and同时满足多个条件的查询

    比如查询价格大于5小于10元的所有商品

    六,云开发~云函数

    6-1,认识云函数

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions.html

    我们先来看下官方给出的云函数简介

    其实通俗来讲,云函数也是运行在服务器上的,只不过和我们传统开发语言相比。微信官方为我们提供的傻瓜式的一键部署。也就是说你只需要把心思花在业务逻辑代码的编写上即可。无需关心写好如何部署,无需关心安全问题,无需关心鉴权问题。

    我们下面以获取openid为例,来看看云函数,php,Java的实现对比

    • php获取用户openid

      如果用php来获取openid必须经历下面几步
    • 1,去小程序后台拿到appid和appSecret
    • 2,请求微信的对应接口
    • 3,获取数据后进行解码
    • 4,购买服务器,配置服务器
    • 5,购买域名,域名备案,配置https
    • 6,部署php代码到服务器
    • 7,小程序端调用php接口

    Java获取openid和上面的php步骤一样,也是需要上面7步。而我们用云函数获取openid呢,就只需要简单的3步就行了,代码量也能显著减少

    6-1-1,云函数获取openid

    用云函数的话,只需要3步

    • 1,编写云函数
    • 2,一键部署云函数
    • 3,调用云函数

    来看下云函数代码,只需要10行代码,即可轻松搞定

    6-2,云函数的优势

    我们用云函数和上一章的云数据库进行下对比

    操作云函数云数据库
    返回数据上限100条20条
    更新数据都可以更新只有自己创建的才可以更新
    删除数据都可以删除只有自己创建的才可以删除
    运行环境运行在云端Node.js环境运行在小程序本地
    实现功能丰富度非常丰富只能实现数据库增删改查
    • 来看下官方文档是如何描述云函数的
      云函数属于管理端,在云函数中运行的代码拥有不受限的数据库读写权限和云文件读写权限。需特别注意,云函数运行环境即是管理端,与云函数中的传入的 openId 对应的微信用户是否是小程序的管理员 / 开发者无关。

    6-3,云函数调用演示

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/functions/Cloud.callFunction.html

    6-3-0,初始化云函数的环境

    • 1,创建一个文件夹cloud和pages平行
      在这里插入图片描述
    • 2,在project.config.json里面配置云函数所在目录为cloud
      在project.config.json里面添加如下配置
      然后点击保存,我们的cloud文件夹前面就有一个云朵

      就代表我们云函数初始化成功啦。
    • 新一个云函数
      在这里插入图片描述
    • 如果只创建一个云函数的时候,会出现下面的问题。

      解决方案:只需要在cloud文件夹下新建一个空白文件即可。

    6-3-1,云函数获取openid

    调用云函数有两种写法

    • 1,传统的success和fail
    • 2,用promise写法then和catch

    6-3-2,数据的导入和导出

    • 数据导出,做数据备份

      比如导入为json数据如下
    • 数据导入,为了快速的大量的创建一些数据。
      为了方便付费用户,我这里提前准备好了108条数据,付费用户直接去下载即可

      把下载好的这108条数据的json文件,导入到数据库如下

    6-3-3,云函数获取数据

    注意:云函数只要有变动,就要重新部署,否则云函数不生效。

    遇到了一个问题,如下

    出现原因:如果你有两个云开发环境,偶尔会出现上图所示的问题。
    解决问题:有两种

    • 1,在云函数里指定你要使用那个云开发环境
    • 2,使用DYNAMIC_CURRENT_ENV常量 (提倡使用这个)

      我们这里会和小程序里直接调用数据库的查询进行下对比

    6-3-4,云函数修改数据

    本地小程序直接调用数据库修改会有问题

    • 只能修改自己创建的数据,别人创建的数据,就没有办法修改了。

    • 如何解决呢? 用云函数来修改就可以解决这个问题啦。

    • 1,先创建云函数update0129

    • 2,调用云函数就行修改

    6-3-5,云函数删除数据

    • 1,创建一个删除商品的云函数remove0129
    • 2,调用这个云函数进行删除操作

    6-3-6,提交数据到云函数

    • 1,创建云函数,并部署
    • 2,调用云函数

    6-4,使用云函数常见问题

    6-4-1,云函数里面没有初始化环境变量


    解决方案如下:
    使用DYNAMIC_CURRENT_ENV

    代码片段

    cloud.init({
      env: cloud.DYNAMIC_CURRENT_ENV 
    })
    

    七,云开发~云存储

    首先来看下官方对云存储的介绍:
    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/storage.html

    说白了,云存储就是可以用来存储视频,音频,图片,文件的一个云存储空间。如果你的小程序需要用到视频播放,音频播放,图片展示,文件上传与下载功能,就可以用到我们的云存储了。

    • 使用云存储来存储文件时,文件名的命名有一些规则,建议看一下。

    7-1,云开发控制台管理文件

    控制台也可以很方便的管理文件。

    7-2,上传图片到云存储

    我们上传图片之前需要先选择图片,所以这里用到一个图片选择的功能

    对应的官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html

    然后调用文件上传的api接口即可

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/storage/uploadFile/client.uploadFile.html

    7-3,给商品列表加商品图片

    我们既然已经学完图片上传功能了,那么我们就可以改造下我们之前的商品列表了,给我们的商品列表添加商品图片。

    7-4,上传视频到云存储

    上传视频之前同样需要先选择视频,选择视频的代码如下

    对应的官方文档如下:https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseVideo.html

    选择好视频以后,同样是调用文件上传api,因为视频也是一个文件。

    7-5,上传word,excel文件到云存储

    7-5-1,上传之前先选择文件

    选择文件的时候记得把type设置为file

    对应的官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseMessageFile.html

    • 这里有一点需要注意
      在电脑模拟器上是选择电脑上的文件,在手机上运行小程序进行选择文件时是选择你聊天记录里的文件。

    7-5-2,上传文件

    在上面选择好文件以后,我们还是要调用uploadFile进行文件上传

    7-6,下载文件

    使用wx.cloud.downloadFile下载文件
    https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/storage/downloadFile.html

    7-7,下载并打开word,excel,pdf

    使用wx.openDocument打开文件
    https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.openDocument.html

    八,列表的下拉刷新

    8-1,开启页面下拉刷新

    我们需要在app.json获取页面对应的json里设置enablePullDownRefresh属性为true来开启下拉刷新。



    由于我们的刷新动画默认是白色圆点,所以还要在json里设置页面背景色才可以看到动画。

    8-2,在Page的onPullDownRefresh里监听刷新


    在page里的onPullDownRefresh方法里监听下拉刷新

    8-3,用户下拉刷新时请求最新数据

    8-4,数据请求成功后停止刷新

    我们在下拉刷新时,刷新动画一般很久才结束,正常情况下应该是数据请求成功后就结束刷新动画。所以我们通过wx.stopPullDownRefresh()方法来结束刷新动画。
    官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/ui/pull-down-refresh/wx.startPullDownRefresh.html

    代码示例如下

    九,列表的分页加载

    9-1,小程序数据库每次最多20条

    小程序数据库api和云函数调用数据的限制
    小程序端直接调用云数据库时,每次最多可以获取20条,云函数里调用云数据库时每次最多获取100条。所以我们数据多的时候要做分页加载。

    9-2,分页加载的核心方法

    我们做分页加载时,主要用到了skip和limit方法,对应的官方文档如下

    • skip:每页加载多少条
      https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/collection/Collection.skip.html
    • limit: 加载第几页的数据https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/collection/Collection.limit.html

    其实这个skip和limit我在数据库的那一节有做初步讲解,这一节我们就借助具体分页加载的案例来做综合讲解

    9-3,导入108条数据

    9-3-1,下载数据源

    这108条数据是石头哥提前为付费用户/年卡用户准备好的,如果你没有付费,可以自己去数据库里创建108条数据即可。

    9-3-2,导入到数据表

    我这里导入到num数据表,导入成功如下:

    9-3-3,别忘记修改表权限

    把数据表(集合)的权限改为所有用户可读,仅创建者可读写。

    9-4,上拉加载更多监听

    我们的列表滑动到最后一个数据时,会执行下面的方法

    所以我们的分页加载要在onReachBottom里做。

    9-5,数据库分页加载代码实现

    直接调用数据库每次最多只能加载20条数据

    wxml里只做简单的列表数据显示就行了

    wxss做个简单的样式

    对应的效果如下

    9-5-1,没有更多数据时的友好提示

    9-5-2,加载中和加载完成的友好提示

    • 加载中
       wx.showLoading({
          title: '加载中...',
        })
    
    • 隐藏加载中
    wx.hideLoading()
    

    9-6,通过云函数实现分页加载

    通过云函数调用数据库,每次最多可以加载100条数据.

    • 如果每页20条以内,不建议用云函数
    • 如果分页的时候,每页大于20条,就用云函数。

    十,搜索功能

    今天来给大家讲讲小程序的搜索功能。我这里后台数据库用的是小程序云开发的云数据库。所以我们搜索的时候就要借助云开发来实现。

    注意:我们存数据的数据表(集合)要把权限改成如下所示。

    10-1,需求

    比如我这里有如下的一些数据

    我有为大家准备好数据源,就在我们对应章节的视频目录下,大家可以自己一个个添加数据,当然也可以直接导入石头哥的数据源,我会在视频里教大家复习下如何导入数据到云开发数据库。

    我们想实现如下搜索需求

    • 1,搜索标题(title)包含‘小石头’的数据
    • 2,搜索标题(title)或者描述(desc)包含‘小石头’的数据
    • 3,搜索标题(title)描述(desc)都包含‘小石头’的数据

    我们知道数据库查询的时候有个where语句,但是where语句是查询某个字段全部包含你输入的内容时才可以,所以单纯用where语句来做搜索的话,结果太单一。所以我们今天就来学习下模糊搜索功能的实现。我们以上面三个需求为例,来一个个讲解。

    10-2,实现原理

    我们做模糊搜索的时候,其实就是查询某个字段里是否包含我们的搜索词。而模糊搜索需要借助RegExp,来看看RegExp是什么。

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Database.RegExp.html

    • 再来看看官方示例

      可能看官方示例会有点糊涂,那么我们接下来就结合具体代码来给大家做下讲解。

    10-3,模糊搜索的代码实现

    10-3-1,模糊搜索单个字段

    • 需求:搜索标题(title)包含‘小石头’的数据

    代码如下

    查询结果如下:

    可以看到我们成功的查询到了标题里包含‘小石头的数据’

    10-3-2,模糊搜索多个字段(满足一个即可)

    • 需求:搜索标题(title)或者描述(desc)包含‘小石头’的数据

    由于我们要查询多个字段,所以我们这里用到了command高级操作符里的or

    代码如下:

    查询结果:

    我们来分析下这两条数据

    • 1,标题和描述都包含‘小石头’,符合
    • 2,虽然标题里没有‘小石头’,但是描述里有,所以也符合。
    • 3,title和desc里都没有‘小石头’,所以不符合。

    10-3-3,模糊搜索多个字段(要同时满足)

    • 需求:搜索标题(title)描述(desc)都包含‘小石头’的数据

    由于我们要查询多个字段,所以我们这里用到了command高级操作符里的and

    代码如下:

    查询结果:

    我们来分析下这两条数据

    • 1,标题和描述都包含‘小石头’,符合
    • 2,虽然desc里没有‘小石头’,但是title里没有,所以也不符合。
    • 3,title和desc里都没有‘小石头’,所以也不符合。

    10-4,源码

    为例方便大家使用,我把完整的代码贴到这里,后面大家使用时,直接复制这里的代码,略微改造下就可以了。

        //我这里简单起见就把搜索词写死,正常应该用户输入的
        let searchKey = '小石头'
        let db = wx.cloud.database()
        let _ = db.command
    
        db.collection('news')
          .where(_.or([
            {//标题
              title: db.RegExp({ //使用正则查询,实现对搜索的模糊查询
                regexp: searchKey,
                options: 'i', //大小写不区分
              }),
            },
            {//描述
              desc: db.RegExp({
                regexp: searchKey,
                options: 'i',
              }),
            }
          ])).get()
          .then(res => {
            console.log('查询成功', res)
          })
          .catch(res => {
            console.log('查询失败', res)
          })
    

    10-5,获取用户输入的搜索词显示搜索列表

    其实获取用户输入的内容,我们之前讲过很多遍了,就是用input组件,通过bindinput来获取用户输入的搜索词,然后点击搜索实现搜索功能。
    要实现的效果图如下:

    然后我们搜索对应的关键词以后可以显示对应的搜索结果在列表上

    我会在视频里带着大家一步步的实现。

    十一,云开发实现登陆注册功能

    具体代码的编写请跟着石头哥的视频走

    11-1, 注册页

    注册页主要用到了input组件获取用户输入,button组件实现注册功能,注册主要是把账号名和密码添加到云开发数据库

    11-2, 登陆页

    登陆主要是获取用户输入的账号和密码,然后从数据库里读取相应的数据,做账号和密码的比对,如果账号和密码都一样,就可以直接登陆成功

    11-3, 登陆成功跳转到首页

    登陆成功以后,会调整到首页

    11-4, 保存登陆状态

    我们通常做登陆时,用户登陆成功后我们需要帮用户保存登陆状态,要不然用户下次再进入应用时还要重新登陆。所以我们要做下用户登陆状态的保存

    十二,云开发实现点赞收藏评论功能

    具体代码的编写请跟着石头哥的视频走

    12-1, 常用图标获取网站

    这里用了一个阿里巴巴矢量图库:https://www.iconfont.cn

    12-2, 云函数里初始化云开发环境

    cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
    })
    

    十三,评论功能的简单实现

    具体代码的编写请跟着石头哥的视频走,这一节不在准备笔记

    十四,CMS网页版管理后台

    14-1,开通cms的准备工作

    如下图所示,直接点击开通内容管理(CMS)即可

    开通cms需要你云开发里使用按量付费,如果你是第一次开通云开发,记得做如下选择。
    在这里插入图片描述
    如果你已经开通过云开发,记得把付费模式改为按量付费。如果你一开始云开发不是按量付费的模式。

    点击完开通以后,会有如下弹窗,直接点击确定即可。不要被付费吓着,官方每月会送我们一定的免费额度的。学习得话基本上够用了。

    上面点完确定后,我们只是开启了按量付费功能,因为cms得使用必须要开通按量付费才可以得。所以还要再点一次开通。如下图

    点完开通后,会有如下弹窗,直接点击下一步即可。

    然后我们需要设置登录内容管理后台得账号和密码,然后点击确定即可

    然后我们就等待内容管理功能得开通了,需要等几分钟。

    开通成功以后,我们就可以通过下面这个地址进入管理后台了。

    后面我们统一称内容管理为cms

    14-2,注意事项

    • 一个云开发环境对应一个内容管理(cms)
    • cms开通会存在开通失败的情况,如果开通失败了,就用新的云开发环境去开通,如果新的云开发环境还是不行的话,那就只能重新去注册一个新的小程序了。一个小程序是可以开通两个云开发环境的。

    14-3,登录Cms可视化管理后台

    上面开通好以后,就可以通过后台地址登录管理后台了。如下

    14-4,在cms里创建后台项目

    第一次登录,我们还需要创建一个项目

    自己输入项目名和项目id即可

    然后点击进入刚刚创建的项目

    到这里我们的cmd可视化网页管理后台就创建好了

    14-5,内容模型


    我会在视频里教大家如何创建内容模型,其实内容模型和我们数据库里的数据表(集合)是对应起来的。

    14-6,数据类型

    我们往内容模型里添加数据类型的时候可以选择如下一些类型

    我会在视频里把一些常用的数据类型给大家做详细讲解

    14-7,数据表(集合)管理

    我们可以对上面创建好的内容模型(集合)进行可视化的管理,这也是cms的优点,可以让我们对数据库进行可视化的管理。

    14-8,综合案例

    我会结合cms和云开发数据库,教大家实现一个简单的新闻小程序,有如下功能点

    • 1,新闻列表
    • 2,新闻详情
    • 3,图文混排
    • 4,富文本编辑
    • 5,rich-text的学习

    rich-text官方文档:
    https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html

    我会在视频里教大家一步步的实现这个综合案例,这个综合案例能跟着石头哥完整的做下来的话,你的小程序云开发的知识点也就学习的差不多了。

    云开发实战案例···》

    实战一,云开发实现订阅消息推送

    之前的通过formid发送模板消息推送,将在2020年1月10日下线,所以我们不得不使用订阅消息了。

    我们先来看下订阅消息的官方简介。

    接下来我们就来借助云开发,来快速实现小程序消息推送的功能。

    1,获取模板 ID

    这一步和我们之前的模板消息推送是一样的,也是先添加模板,然后拿到模板id

    首先是开通订阅消息功能,很简单,如下图

    由于长期性订阅消息,目前仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。仅就线下公共服务这一点,长期性订阅消息就和大部分开发者无缘了。
    所以我们这里只能以使用一次性订阅消息为例。

    如上图,我们从公共模板库里选择一个一次性订阅的模板。然后编辑模板如下图

    下图就是我们添加好的模板,下图的模板id就是我们需要的。

    2,请求用户授权

    我们做订阅消息授权时,只能是用户点击或者支付完成后才可以调起来授权弹窗,官方是这么要求的:

    我们这里用到了wx.requestSubscribeMessage这个方法,来获取用户的授权。

    • 1,编写index.wxml代码
    • 2,编写index.js代码,实现点击获取授权

      这一步tmplIds里的一串字符,就是我们自己添加的模板id
    • 3,点击按钮运行效果如下
      开发者工具模拟器上点击授权弹窗是这样的:

      手机上的授权弹窗是这样的:

      可以看到,这里显示的就是我们添加的 ‘上课提醒’的模板。
      细心的同学可以看到, 真机上多了一个 ‘总是保持以上选择,不再询问’
      其实,你自己仔细多品一些。也能明天,我们正常订阅消息授权时,用户允许的话,你只能推送一次消息。也就是用户允许一次,我们就可以推送一条消息给用户,并且这个允许不存在过期。所以我们可以让用户尽量多的点击允许,这样我们就可以尽量多的给用户发送消息了。

    这里用户允许后,我们就可以给用户推送消息了,接下来我们来借助云开发的云函数来实现消息推送功能。

    3,获取用户的opneid

    先来看官方爸爸是怎么说的。

    可以看出官方提供了两种方式,我们这里使用云调用。说白了就是在云函数里调用推送功能。

    • 推送所需参数

      可以看到我这里用来openapi功能,并且需要用到用户的opneid,关于openid的获取,我之前有写过文章,也录过视频的。文章的话,大家去翻下我历史的文章,视频的话,点击这个即可:《借助云函数获取用户openid》
      这里的openid的获取我就不再详细讲解了,把对应云函数的代码给大家贴出来。

      在使用云开发时,有几点需要注意的
    • 1,需要在project.config.json里创建云函数目录如下图
    • 2,需要在app.js里初始化云开发环境

      至于云开发的环境id从哪里拿,我视频里也讲过很多遍了,直接去看我视频或者翻看我历史文章即可。
      《零基础入门云开发视频》

    4,用云函数实现消息推送

    我们只需要创建一个云函数如下,然后填入用户的openid,要跳转的小程序页面链接,模板内容,模板id即可。通常这些数据都应该传进来,简单起见,我就把这里的模板内容写成固定的。

    注意:我在编写上面的代码时,推送内容的key必须和小程序模板里的key保持一致,否则就会报如下错误。

    • 然后看下调用这个云函数的地方

      如果用户没有授权,我们推送会报如下错误

      如果用户授权过,我们就可以成功推送了,推送后的打印日志如下

      还记得我们真机上的授权吗,如果用户只是点击了允许,没有选择一直允许,那我我们在推送成功一次后,如果再次推送,就需要用户重新授权。否则,还是会报这个错误的

      所以我们用户点击一次允许,我们就可以推送一次消息,比如,我点击了4次允许那么我就可以成功的推送4次

    效果图


    可以看到,我们成功的收到 上课提醒的模板消息,点击进去,就是我们具体的推送内容

    其实我这是连续收到了4条消息,因为我点击了4次允许推送,所以就可以成功的推送4次。

    到这里我们就完整的实现模板消息推送功能了,下面我把主要代码贴给大家,大家也可以私信我获取完整源码。

    • index.wxml
    <button bindtap="shouquan" type='primary'>获取订阅消息授权</button>
    <button bindtap="getOpenid">获取用户的openid并推送消息</button>
    
    • index.js
    //编程小石头wechat:2501902696
    Page({
      //获取授权的点击事件
      shouquan() {
        wx.requestSubscribeMessage({
          tmplIds: ['CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU'], //这里填入我们生成的模板id
          success(res) {
            console.log('授权成功', res)
          },
          fail(res) {
            console.log('授权失败', res)
          }
        })
      },
      //获取用户的openid
      getOpenid() {
        wx.cloud.callFunction({
          name: "getopenid"
        }).then(res => {
          let openid = res.result.openid
          console.log("获取openid成功", openid)
          this.send(openid)
        }).catch(res => {
          console.log("获取openid失败", res)
        })
      },
      //发送模板消息到指定用户,推送之前要先获取用户的openid
      send(openid) {
        wx.cloud.callFunction({
          name: "sendMsg",
          data: {
            openid: openid
          }
        }).then(res => {
          console.log("推送消息成功", res)
        }).catch(res => {
          console.log("推送消息失败", res)
        })
      }
    })
    
    • 推送对应的云函数
    //编程小石头wechat:2501902696
    const cloud = require('wx-server-sdk')
    cloud.init()
    exports.main = async(event, context) => {
      try {
        const result = await cloud.openapi.subscribeMessage.send({
          touser: event.openid, //要推送给那个用户
          page: 'pages/index/index', //要跳转到那个小程序页面
          data: {//推送的内容
            thing1: {
              value: '小程序入门课程'
            },
            thing6: {
              value: '杭州浙江大学'
            },
            thing7: {
              value: '第一章第一节'
            }
          },
          templateId: 'CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU' //模板id
        })
        console.log(result)
        return result
      } catch (err) {
        console.log(err)
        return err
      }
    }
    

    后面我会分享更多小程序相关的知识出来,请持续关注。

    注意:授权一次,只能发送一条消息。

    5,发送订阅消息给多个用户

    //发送订阅消息给多个用户
      sendAll() {
        if (name == null || name == '') {
          wx.showToast({
            icon: "none",
            title: '请输入课程名',
          })
          return
        }
        let users = [
          "oc4sa0Vp_s65LEItm4JSWT5WFQds",
          "oc4sa0dZ-pSCu95djiLCt7jo97bY"
        ]
    
        users.forEach(item => {
          console.log("for循环", item)
          this.sendFun(item, name)
        })
      },
      //封装的方式方法
      sendFun(openid, name) {
        wx.cloud.callFunction({
          name: "fasong",
          data: {
            openid: openid,
            name: name
          }
        }).then(res => {
          console.log("发送单条成功", res)
        }).catch(res => {
          console.log("发送单条失败", res)
        })
      }
    

    实战二,短信验证码

    老规矩先看效果图

    普通短信

    验证码短信

    今天被云开发官方告知,云开发支持发短信功能了,然后就迫不及待的来尝下鲜。

    官方文档:
    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.sendSms.html

    进入官方文档一看,云开发给咱们开发者的福利还真不小。
    不仅仅可以很方便的使用短信功能,还送了咱们1000条免费短信。不用白不用嘛。这1000条短信足够咱们把小程序短信功能,和小程序短信验证码功能都学会了。
    废话不多说了,咱们直接来撸代码

    1,使用云开发短信的条件

    这个前置条件很重要,条件不满足,你就没法使用云开发短信功能。

    使用条件

    • 1,必须是企业小程序,目前个人小程序无法使用短信发送
    • 2,必须开通静态网站功能(后面应该会逐步放开)
    • 3,必须开通云开发(这个没得说,不开通云开发你还用啥云开发功能啊)

    上面条件都满足以后,我们就可以来愉快的撸代码了。

    年卡福利

    • 1,可以获取石头哥目前所有视频课
    • 2,未来一年内出的新课也可以获取
    • 3,一对一问题解答,远程协助
    • 4,可以借用石头哥的企业小程序

    感兴趣可以加石头哥微♥ 2501902696 备注年卡

    2,开通静态网站功能

    如果你不开通静态网站,直接调用短信发送,会报如下错误。

    其实官方文档里也有给出这个错误。

    那么我们就来开通静态网站功能。开通静态网站功能之前,必须开通云开发,配置好云开发的环境。这些我在云开发入门里讲过很多遍。还不知道的同学可以翻看下我前面的文章或者视频:https://edu.csdn.net/course/detail/26572

    这里开通云开发我们借助小程序开发者工具来实现快速开通。

    2-1,注册小程序

    这里我就不再多说了,只有注册过小程序的appid才可以开通云开发

    我们注册好小程序后,就可以拿到appid了,如上图

    2-2,创建一个小程序项目

    小程序项目的创建,我这里不再多说,我前面小程序基础课里有讲过很多遍。《小程序基础学习》

    这里强调一点,就是创建小程序项目时一定要用我们自己的appid不要用测试号。
    在这里插入图片描述
    如果你一开始是用测试appid创建的,也可以通过上图的方式更换成自己的小程序的appid。

    2-3,开通云开发

    这里云开发的开通,我就不做过多讲解了,我云开发课程里也讲过很多遍。大家可以去翻看下

    只需要点击开发者工具里的云开发按钮,跟着提示一步步操作就可以快速开通云开发。

    2-4,开通静态网站功能


    我们上面云开发开通好以后,就可以在这里快速开通静态网站了。

    点击以后,直接点击开通即可

    这时候开通有个条件

    我们必须按照要求改变自己小程序的付费方式,把我们的付费方式改成按量付费即可。

    这里不用担心,这里的按量付费,每月都有免费额度。这些额度我们开发学习基本上够用了


    这个时候我们的静态网站功能就开通成功了。

    开通成功以后如下图。

    3,编写发送短信的云函数

    其实上面静态网站功能开通以后,我们不用上传网站资源,就可以直接来使用短信功能了。
    下面我们就来使用云开发的云函数功能来做短信发送功能。
    老规矩先看效果图

    代码编写也很简单

    其实发送短信的代码很简单,就上面这几行。下面就来教大家如何编写这个云函数。

    3-1,初始化云开发环境id

    新建一个和pages平级的目录cloud,用于存放云函数

    然后在project.config.json里添加cloudfunctionRoot选项。

    然后对cloud选择当前环境

    在app.js里配置环境变量

    这个env环境id需要你去云开发控制台获取

    3-2,创建云函数

    右键cloud目录,新建Node.js云函数

    然后新建一个云函数,名字你可以自定随便定。我这里用sendSms

    3-3,编写云函数


    我这里把代码贴给大家,记得把env和接收短信的手机号换成你自己的。

    const cloud = require('wx-server-sdk')
    cloud.init({
      env: cloud.DYNAMIC_CURRENT_ENV
    })
    exports.main = async (event, context) => {
      try {
        const result = await cloud.openapi.cloudbase.sendSms({
          env: 'xiaoshitou-zfl2q',
          content: '编程小石头发布了新的能力',
          phoneNumberList: [
            "+8615611823564"
          ]
        })
        return result
      } catch (err) {
        return err
      }
    }
    

    3-4,部署云函数

    上面云函数编写好了,一定要记得部署下云函数。右键sendSms然后点击下面箭头所示的即可。

    上传部署成功后,会有下面这样的提示

    4,调用云函数发送短信

    我们上面云函数编写并部署成功以后,就可以来调用这个云函数,发送短信了。

    4-1,编写wxml文件

    在wxml文件里写一个button按钮,编写一个bindtap点击事件

    4-2,编写js文件

    在js文件里实现上面button的点击事件,然后调用云函数

    调用云函数时,一定要记得这里的name必须和你的云函数名一模一样。

    4-3,点击发送短信

    点击发送短信

    点击发送 短信以后,可以看到日志里打印openapi.cloudbase.sendSms:ok
    这就代表发送成功了。
    然后再看下手机,收到下面的短信。

    到这里我们的短信发送功能就完整的实现了。
    其实到这里该实现的功能,就已经实现了。但是我们使用短信场景更多的是用短信发送验证码。所以接下来给大家做一个发送短信验证码的例子出来

    5,发送验证码短信

    老规矩,先看效果图

    我们只需要获取用户输入的手机号,然后点击获取验证码,最后输入短信里接收到的验证码,进行验证即可。

    5-1,编写wxml

    页面比较简单,就两个输入框和两个按钮

    5-2,编写js

    js里主要是获取用户输入的手机号,然后发送验证码,发送验证码调用云函数实现短信验证码发送功能。用户输入验证码以后进行校验即可。

    5-3,发送短信验证码

    用户输入手机号以后,点击发送,可以看到我们手机上收到了如下短信。


    然后用户输入获取到的验证码,点击验证。

    可以看到验证成功,验证成功以后后面的操作就可以自己定了,比如验证成功以后跳转到登录成功页。

    到这里我们就实现了验证码发送功能了。

    5-4,生成随机验证码的方法

    我这里把生成随机验证码的方法贴给大家。

    字母和数字混合

      //获取随机验证码,n代表几位
      generateMixed(n) {
        let chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
        let res = "";
        for (var i = 0; i < n; i++) {
          var id = Math.ceil(Math.random() * 35);
          res += chars[id];
        }
        return res;
      }
    

    数字混合

      //获取随机验证码,n代表几位
      generateMixed(n) {
        let chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
        let res = "";
        for (var i = 0; i < n; i++) {
          var id = Math.ceil(Math.random() * 9);
          res += chars[id];
        }
        return res;
      }
    

    实战三,群发短信

    我们上面给单个手机发送验证码的功能实现了,接下来就教大家如何群发短信。

    老规矩,先看效果图

    官方文档:
    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.sendSms.html

    使用云开发短信的条件

    这个前置条件很重要,条件不满足,你就没法使用云开发短信功能。

    • 1,必须是企业小程序,目前个人小程序无法使用短信发送
    • 2,必须开通静态网站功能(后面应该会逐步放开)
    • 3,必须开通云开发(这个没得说,不开通云开发你还用啥云开发功能啊)

    上面条件都满足以后,我们就可以来愉快的撸代码了。

    年卡福利

    • 1,可以获取石头哥目前所有视频课
    • 2,未来一年内出的新课也可以获取
    • 3,一对一问题解答,远程协助
    • 4,可以借用石头哥的企业小程序

    感兴趣可以加石头哥微♥ 2501902696 备注年卡

    1,编写wxml页面

    简单起见,我这里只定义一个输入手机号的输入框和一个button按钮

    对应的代码如下
    在这里插入图片描述

    2,获取用户输入的手机号

    我这里以*来分割手机号,如下图所示。

    然后我们定义一个bindinput事件来获取用户输入的内容。

    可以看到,我们成功的获取到了用户输入的手机号了。

    但是官方文档里已经说明,我们群发短信的时候需要用到的是一组手机号,也就是说需要用数组来存放数据。但是我们这里是一个字符串。那么我们就要分割字符串成数组了。

    3,分割字符串成数组

    我们分割字符串用到的是字符串的split()方法

    当然触发的时机,应该是在用户点击群发按钮的时候。那么我们就为群发按钮定义bindtap点击事件send

    可以看到我们成功的把字符串分割成了数组。

    但是我们数组里的手机号前面有个回车键,所以安全起见,我们在分割字符串之前,需要先把这回车键给剔除掉。

    4,去除字符串里的回车键

    去除字符串里的回车键语法如下

    字符串.replace(/[\r\n]/g, "")
    

    可以看到我们只需要调用字符串.replace方法即可,后面括号里跟的是回车键对应的正则表达式。这里不需要记住,后面用的时候来我笔记这里复制就行了。

    可以看到我们剔除回车键以后,再分割的字符串里就没有回车键了。

    5,遍历数组给手机号前面+86

    如果你有仔细阅读官方文档,可以看到我们群发的手机号前面必须以+86开头。并且每次群发的手机号不能超过1000条。

    那么我们接下来就要遍历数组,给每个手机号前面都添加‘+86’了。
    当然了这里有很多种方法来实现这一目的,我这里用一个for循环和一个map方法来分别实现下。

    可以看出用map方法更简介一点。但是对于新手来说第二种方法可能不是很好理解。所以这里你用那种方法都可以,不做强制要求。

    5-1,通过for循环来实现

    5-2,通过map方法来实现

    6,编写群发短信的内容

    那么我们接下来要做的就是实现群发功能了。我们这里要想成功的实现群发,需要两个元素

    • 要群发的短信内容
    • 要群发的手机号

    关于手机号和群发内容都有要求

    我们群发手机号这里已经符合要求了,接下来就是群发的内容了。群发内容最长不能超过60个字节,一个汉字通常2~3个字节。也就是说我们短信内容不能超过20个字,所以群发的短信一定要精细。用最少的字来吸引用户。

    这里其实就是一个input来获取用户输入的内容就行了。我不再多讲,直接把代码贴出来。

    在js里获取用户输入的短信内容

    现在完事具备,只欠一个云函数了

    7,编写群发短信的云函数

    短信内容和群发的手机号都已经成功拿到了,我们接下来就要来编写群发的云函数了。

    云函数其实我们短信验证码那一节基本上一样,区别就是

    • 短信验证传入的是:验证码+单个手机号
    • 群发传入的是:短信内容+多个手机号

    云函数编辑好,记得重新部署下。

    8,调用云函数实现群发

    上面云函数编辑好了,也部署好了,接下来就是要调用云函数实现短信群发了。

    调用其实很简单。

    9,群发演示失败

    接下来我们就要验证自己的劳动成果了。如下,我发这样的内容给两个手机号。为什么是两个呢,我这里是学习,要节省短信条数。官方只送我们1000条。所以要省着点用。

    其实群发两个手机号,和群发1000个没区别,只要群发两个成果,那么群发1000个也一样的。

    辛辛苦苦编写好了,测试了下,居然报错

    什么鬼,代码明明没有错误啊,程序员有时候就是莫名的自信。
    官方给的发送成果返回字段如下

    石头哥发送返回结果如下

    百思不得其解啊。不会真是代码写错了吧。。。。
    还好石头哥比较聪明,翻译了一下报错信息。

    发送时间限制,也没看到官方文档有说时间限制啊。后来又去官方文档翻来覆去,终于在一个角落里看到了这句话。

    原来是石头哥写文章太晚了。。。。

    本来想写完文章,直接录讲解视频给大家的,,,,看来只能等第二天8-22:00来续写这篇文章了。。。。

    10,群发演示成功

    终于等到了第二天8点47,下面我们把昨天的群发短信再演示一遍,看这次能不能成功。
    先来看我们的日志

    可以看出日志上显示成功的发送两个。那么收到的短信长什么样子,也给大家截个图。
    第一个手机号是安卓手机

    第二个手机号是苹果手机

    到这里我们的群发短信功能就完整的实现了。

    展开全文
  • Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。 因为涉及的内容很多没法一两篇文章就介绍详细清楚,方便起见我用PPT...

    Gradle是什么

    Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。

    因为涉及的内容很多没法一两篇文章就介绍详细清楚,方便起见我用PPT图片的形式简单介绍一下。如果需要更详细了解学习的朋友可以看文末。

    1、一定要把基本的数据结构,经典的算法,Unix编程,程序编译链接及计算机原理等基础知识扎牢,这些会长远影响你的职业发展。

    2、 推荐从C语言入门,不单是因为很多操作系统、网络协议栈开源代码由C/C++实现,更多是因为C语言自身的特性:作为高级语言用户无需关注底层细节,同时能直观的看到数据流向。而且C相对语法规则较为简单,可以短时间的上手应用。最重要的是,遵循C/C++、python的学习方式,比直接学习python更能清晰的知道自己程序的内存等性能状况。

    3、 不要过于追求第一份工作的工资,甚至可以说不要过于看重前两年的工资(虽然我工作也没满五年,这里的意思是,前两年不要因为多出来的一两千月薪转换自己的行业),也不需要过于学习如何投资股票理财(但是要有基本的风险意识),身边很多三十多岁才开始理财的人同样实现了财富自由。而是要扎扎实实做几个完整的项目,学习好基础原理,同时琢磨业务流程。当然大厂会有很多流程性的杂事,如何尽快处理不要过于消耗自己的宝贵时间,这个就是另一门学问了。

    4、 胆子要大,要多发出自己的声音。很多职场新人在项目讨论的时候会担心自己技术深度不足,提出的观点比较浅薄,这个是不对的。说得不好听,我们都是来打工的,赚钱才是王道,面子是最不重要的。只有多表达自己对业务的思考才能展现自己的价值,很多时候跟人探讨自己的想法能及快速的更新自己的知识储备。

    5、 答主机械工程出身,再说说机械(包括电气)工程如何转行进入互联网公司。看情况,如果是本科,极力建议跨考电气工程,因为很多基础课程像数电模电、电工学、高等数学等重要课程两个学科都有学习,考研难度相对较小。如果是机械的硕士,那么建议先把算法与数据结构全部学习一遍,不一定非要找创业互联网公司的实习,进去一两个月学不到完整的项目开发流程。尽量加入一个学校内部的团队完成一个项目,像华为每年都会在各大高校设置编程大赛等,这些可以让你全方位的了解进入软件行业必备哪些技能。对于已经工作的老铁,像我就是毕业入职后转行的,这里给一下我的学习过程仅供参考。尽快入门C语言,利用下班时间刷题把上面链接提供的算法与数据结构等书完整的自己敲一遍代码。然后选择热门的嵌入式操作系统如freertos熟读源码理清嵌入式系统内部任务调度、内存管理、任务通信机制等基本原理,动手移植一款热门芯片如stm32f429,把tick跑起来,任务调度起来就OK了。为什么选热门芯片,因为各种坑前任都踩过,论坛咨询问题相当容易。然后就可以上手UNIX环境高级编程这本圣经了。一般而言,学完嵌入式系统,再学linux系统的进程通信、虚拟化等,你会发现比直接学习Linux要容易上手很多。对unix系统调用有了基本了解之后进行Linux应用开发基本难度不大了,如果有公司业务结合练手那是最好的。接下来就看自己的发展方向了,如果想在物联网深入发展,可以移植一下A核,对中断处理会有更深刻的理解。如果想从事网络或者后台开发,可以多熟悉网络协议栈,这里推荐lwip入门,里面给出了TCP、UDP协议规范的完整代码实现,对理解tcp慢启动、拥塞控制、socket编程帮助相当大。

    6、 不要急于挑选产品经理等管理类岗位,只有多跟几个大型项目,多玩几个迭代,才能对大厂的项目落地流程玩法了然如胸,才能跟各种老油条码农供应商扯皮。对需求理解不清,分分钟被老员工玩死。

    7、 也是一句题外话,前面几年虽然工资不多,但是一定要养成存钱的良好习惯。当你身无分文来到深圳,住着900的农民房,吃着广东烧腊,再看看关外五六万的房价,你就知道深圳的生存有多么艰难。唯有努力才是解决社会问题的基础,如人饮水冷暖自知,很多事情只有自己经历了各中酸楚才知道。

    总结

    **其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。

    像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

    这么重要的事情说三遍啦!点赞+点赞+点赞 免费分享所有学习秘籍!
    直达领取链接:点击链接免费领取【Android高级架构师

    【Android高级架构师系统学习资料】高级架构师进阶必备——设计思想解读开源框架

    第一章、热修复设计
    第二章、插件化框架设计
    第三章、组件化框架设计
    第四章、图片加载框架
    第五章、网络访问框架设计
    第六章、RXJava 响应式编程框架设计
    第七章、IOC 架构设计
    第八章、Android 架构组件 Jetpack

    设计
    第七章、IOC 架构设计
    第八章、Android 架构组件 Jetpack

    展开全文
  • {{title}}
  • 在这种新环境下,工作应该选择大厂还是公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动? 就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面...
  • 从认识小程序开始搭建开发环境,以案例结尾。 学习内容: 1.认识小程序(相关概念) 2.知识储备 3.搭建开发环境 4.目录介绍 5.代码编写 6.文件配置 学习时间: 抽出20分钟基本就可以完成前期学习 文章目录学习...
  • uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 1.1、开发方式 ...
  • 关于安卓如何来学习,安卓入门怎么去学,这一讲主要分享的是安卓APP开发的一个学习路线,原创不易,如果喜欢,分享支持明哥! 我们来进行今天的分享,整个的安卓学习路线,按着这个路线去学习,可以保证能够快速的...
  • 一些个人开发者可以利用流量主赚钱的小程序,工具类的小程序非常适合个人开发,用云开发模式开发成本很低,能够快速上线,唯一的缺点是个人无法接入支付,变现渠道受限,目前只能通过流量主变现。 推荐一些的优秀...
  • 这是一个原创系列连载文章,基于企业真实项目案例分享经验,带你快速入门uni-app开发!欢迎点击头像关注,避免迷路! ​ 前几天,不少读者私信咨询前文中项目案例的种种实现细节,本文先揭晓使用的开发工具。 ​ ...
  • 【微信小程序开发小白零基础入门】微信小程序界面API【建议收藏】 文章目录【微信小程序开发小白零基础入门】微信小程序界面API【建议收藏】一、 交互反馈1. 消息提示框1.1.1 显示消息提示框1.1.2 关闭消息提示框2....
  • 微信小程序开发入门(一)

    千次阅读 2021-08-24 09:10:51
    字面上讲,小程序就是微信里面的应用程序,外部代码通过小程序这种形式,在微信这个手机 App 里面运行。 但是,更准确的说法是,小程序可以视为只能用微信打开和浏览的网站。小程序和网页的技术模型是一样的,用到...
  • uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 uni-app是一个框架,...
  • 我仍记得2015年我决定做安卓开发的...他最近开源了一本《Android开发入门精编》,总结了他自己做Android开发以来的学习进阶路线和相关的学习资源,非常适合零基础入门的同学,希望大家在学习的时候能够节省时间。纯干货
  • 同样,在现代软件开发环境中,每个Android开发者都需要更好的工具,帮助我们增强功能、提高效率。 在这个竞争激烈的行业中,只有优秀的工程师能够生存,需要我们能够为客户提供的最佳技术和资源,需要有优秀的开发...
  • 开发小程序自然要申请注册一个小程序,我们先进入微信公众平台注册账号(若有账号则直接登录)。 因为微信公众号同时管理着订阅号,公众号以及小程序等多种账号,所以这里要选择小程序账号...在填写完成创建小程序
  • 2、 推荐从C语言入门,不单是因为很多操作系统、网络协议栈开源代码由C/C++实现,更多是因为C语言自身的特性:作为高级语言用户无需关注底层细节,同时能直观的看到数据流向。而且C相对语法规则较为简单,可以短时间...
  • 文章断更了段时间,之前大半年一直在忙创业的事情,期间带领团队从0到1用uni-app+java开发了二款商城类商业级应用,产品形态覆盖H5、微信小程序、IOS、Android。目前产品已成功发布到各大电子市场。 难得有空静下来...
  • Android应用程序开发习题答案

    千次阅读 2021-01-12 18:44:44
    第一章、Android 简介 1.简述各种手机操作系统的特点。 目前,手机上的操作系统主要包括以下几种,分别是...Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放
  • 开发环境Android Studio是谷歌基于IntelliJ IDEA社区版开发的,面向安卓开发的免费集成开发环境。其方便快捷的开发调试和可视化UI编辑可以令安卓开发事半功倍。本项目所使用集成开发环境为Android Studio 4.1.1,...
  • 从2010年开始Android市场开始需要大量的Android开发人员,招聘市场上也开始大量招Android开发人员,大量java开发者开始学习Android开发,招聘市场面试要求上只要有一定java语法基础,都很容易应聘上Android开发的...
  • 前言 许多 Android 开发者经常会问我,要学会哪些东西才能成为一个优秀的 Android 工程师?对于这个问题,他们的描述或多或少都有些差异,但是,...因此,在本文中,我将分享我在 Android 开发中所使用到的重要技能,
  • Android项目驱动式开发教程》第一章开发入门1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码android:icon用来声明整个APP的图标,图片一般都放在drawable文件夹下,使用资源引用的方式。 第10行...
  • 1、展示项目中文件的组织方式,默认是以Android方式展示的,可选择“Project、Packages、Scratches、ProjectFiles、Problems…”等展示方式。平时用的最多的就Android和Project两种。 2、定位当前打开文件在工程目录...
  • 然后有目标的进行实践,也就是要实现个你想要的小程序,这样边实践边学习才能够有疑问,才能够更快的理解和学习小程序开发。所以后续几天就开始小程序实践和学习之旅了,期间也遇到了一些问题并且学到了很多基础知识...
  • 每种编程入门的时候总是要先去掌握一些基础知识和框架,Android游戏开发入门也是一样的,本文所讲内容为Android游戏开发入门必知的知识,希望能为有志从事Android游戏开发的朋友提供些许帮助。 如果你有兴趣为...
  • 文章目录前言创建无障碍程序1.配置无障碍信息属性的说明accessibilityEventTypesaccessibilityFeedbackTypeaccessibilityFlagscanControlMagnification `api>=24`canRequestEnhancedWebAccessibility `api>=18...
  • 微信小程序|入门

    2020-12-23 23:56:33
    2、2019年7月最新小程序开发教程:https://www.bilibili.com/video/BV1Kt411V7rg 1. 小程序背景知识 1.1 小程序特点 类似于Web开发模式,入门的门槛低:基本上是类似html+css+js; 可以直接云端更新:微信审核,...
  • 从零起步,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,801
精华内容 14,720
关键字:

安卓小程序开发入门