微信小程序云开发入门实践

微信小程序云开发入门实践云开发介绍什么是云开发 2017 年微信小程序发布后 一度的开发模式是前端页面使用微信小程序的相关组件 在涉及到后台登录及业务交互的时候 需要使用自建的服务器 后台不管是 PHP 还是 JAVA 架构 都需要暴露相应的接口供微信小程序调用 这种开发模式其一技术架构复杂 开发调试难度大 适合本身业务比较成熟的专业公司使用 之后随着技术的发展 微信推出了云开发的模式 前端还是使用微信的相关组件开发 但是后端

云开发介绍

什么是云开发
2017年微信小程序发布后,一度的开发模式是前端页面使用微信小程序的相关组件,在涉及到后台登录及业务交互的时候,需要使用自建的服务器,后台不管是PHP还是JAVA架构,都需要暴露相应的接口供微信小程序调用,这种开发模式技术架构复杂,开发调试难度大,适合本身业务比较成熟的专业公司使用。
之后随着技术的发展,微信推出了云开发的模式,前端还是使用微信的相关组件开发,但是后端通过微信搭建的NodeJS后台,只需要将相应的业务逻辑封装成函数,供前端调用即可,数据库使用MongoDB,可以在线的创建集合、数据库记录,使用起来非常方便。而且因为前后端技术都用微信自建的技术,所以不需要租用第三方服务器,程序可以自动完成部署,上线通过微信官方代码审核后只需要按照使用的流量交费即可,就和手机的卡一样,开通多少钱的月租就会有多少流量。而且前期有个免费流量,一般的应用开通每月100元的月租即可,整体从开发到运维都非常方便。




如何开通云开发
先需要访问微信公众号的官方地址:https://mp.weixin..com/,自己注册一个账号
官网首页
在主体选择的页面选择小程序
主体选择
因为是需要通过邮箱注册的,邮箱也是日后登录的账号,按照要求操作就可以了
在这里插入图片描述
每次登录的时候需要注册的时候的管理员的微信号码认证一下,通过后就可以打开小程序的后台管理页面了
在这里插入图片描述
日常经常使用的功能是版本管理和用户管理,版本管理是代码提交之后可以设置为体验版本,那么在用户管理的体验人员就可以用手机体验你做的小程序的具体效果。用户管理主要是用来增加体验人员的,当然还可以设置开发人员,总之这两个功能是挺好用的。
在这里插入图片描述
环境搭建
除了后台的日常操作外,像JAVA开发都会有开发工具一样,微信小程序开发也有自己的开发工具,在后台导航栏的文档栏目下边的工具里可以下载安装
在这里插入图片描述
在这里插入图片描述
具体安装就不介绍了,非常简单,按照提示一路下一步就行。
创建项目
工具安装完毕后,双击图标,就可以打开了,这里要强调一个知识点就是APPID,这个呢相当于小程序的唯一标识码,日常创建工程的时候都需要填写,怎么找这个ID呢,在后台打开开发栏目:
在这里插入图片描述
即可找到。
安装完毕后双击安装后的图标
在这里插入图片描述
在打开的界面点击+号创建项目
在这里插入图片描述
选择项目需要新建的目录,录入项目名称,最重要的是填写自己项目的APPID,后端服务选择小程序云开发
在这里插入图片描述
点击新建按钮即可创建云开发的项目
在这里插入图片描述
界面整体功能比较清晰,分为导航栏,左侧的模拟器,和右边的代码管理器
在这里插入图片描述
导航栏的云开发相当于数据库管理的后台入口,点击可以进入管理界面创建集合增加记录,同时可以管理小程序上传的附件。编译器可以清除缓存,选择编译哪个页面。而模拟器的作用是显示程序运行后在手机的效果,代码管理器按照文件夹的形式管理不同业务模块的代码。
在这里插入图片描述
在代码管理器里分为两部分,前端代码和后端代码,前端代码都放在miniprogram文件夹下,后端代码都放在cloudfunctions文件夹下。
本教程为实践教程,后续会以一个实际的小项目来讲解一下如何使用云开发的技术来开发一款小程序。


































































需求分析

项目背景
项目的发起方是长期从事教育行业的资深从业者,为了满足家长快速的找到适合的老师进行一对一的辅导,有了搭建家教平台的需求,为此提出项目需求。
家长需求
首页用于介绍“名师汇➸家教帮帮”小程序的宗旨。具体内容如下,可用一个静态HTML把下面内容编好就行:
培优名师:可以按照九宫格显示学科的科目,点击科目可以列出该科目下的所有老师,再点击老师名称可以看到教师的详细信息。
快速请家教,家长可以发布自己的预约信息,填写自己的要求和实际的位置,便于平台匹配合适的老师。
平台管理的功能
老师管理的功能:可以维护老师的信息,发布到培优名师栏目。
预约管理的功能:可以查看最新的预约信息,列表要区分哪些信息被查看过。
















数据库设计

总体架构

首页

在这里插入图片描述
首页基本上为展示信息,当初考虑使用微信的richtext组件开发,但是主页的内容老改,每次一调整内容得在js里改半天,后来改成了article组件。

wxml代码

 
   
    
     
      
      
        名师帮帮 
       
      
     
     
     
       概述 
      
      
       
       
         “名师帮帮” 
       何老师从事教学工作二十多年,积累了丰富的教学经验和大量的教师资源,同时也感受到家长、学生的需求与资源匮乏之间的矛盾,希望可以借助该平台在学生和老师之间搭建起一座桥梁。 
       
      
     
       教师资质 
      
      
       
       
         “名师帮帮” 
       确认的所有老师都是 
       
         专职的优秀老师 
       (包括一线在职老师和自由老师),均具有丰富的教学经验, 
       
         验证过辅导成绩证明 
       ,分为: 
       
      
        1) 
       
         培优名师 
       :带出过考入清华北大、获得国内国际竞赛大奖或者班级第一名学生的老师。 
       
      
        2) 
       
         补差名师 
       :辅导后孩子单科学习成绩提高三十分以上的老师。 
       
      
     
       运行机制 
      
      
       
       
         “名师帮帮” 
       的运行机制如下: 
       
         1). 家长提供学生的学习情况,由何老师推荐适合的最佳老师; 
        
       
         2). 上课方式可以到家上课,也可双方协商; 
        
       
         3). 课费一次一付给上课老师; 
        
       
         4). 何老师负责跟踪教学过程,协助家长和学生解决问题。 
        
       
      
     
       课费标准 
      
      
       
       
         “名师帮帮” 
       的老师课时(1小时)费用范围为 300~1000元,具体课费根据年级、科目以及上课时间商议而定。 
       
      
     
       联系人:何老师 
      
      
      
        1) 
       
         电话 
       
         (周一至周五10:00-15:00可电话,其余时间请微信) 
        
       
         2) 
        
          微信 
         
       
      
     
    
   

wxss

page { background: #ffffff; display: flex; flex-direction: column; justify-content: flex-start; padding:5px; color:#128b68; } .bg{ padding-right:10px; } .h1_center{ text-align: center; } .bgindent{ background: linear-gradient(to right,#005343,#60501d,#802e00,#82181c); -webkit-background-clip: text; background-clip: text; color: transparent; } .green{ color:#43853b; font-weight:bold; } .weui-article{ padding-top:0px; padding-bottom:0px; } .p_indent{ text-indent: 2em; } .title{ border-left: 3px solid #c60; padding-left:15px; text-shadow: #f7bc9c 1px 0 10px; } 

导航页

在这里插入图片描述
教员速查主要是显示可以开展培训的科目,目前是九个科目,点击某一个科目可以跳转到对应科目的教师列表,这里采用了weui的九宫格布局,在wxml页面里的每个类目绑定类目名称,跳转到列表页的时候传递类目名称

WXML

 
   
    
     
     
       教员速查 
      
     
    
    
     
      
       
        
        
          { 
         {item}} 
         
        
          { 
         {item}} 
          
       
      
     
    
   

WXSS

page{ background: #ffffff; } .title{ padding:20px; color:#F8AD00 } .item{ width:100px; text-align: center; margin-top:25px; } .wrap{ flex-wrap:wrap } .bgindent{ background: linear-gradient(to right,#005343,#60501d,#802e00,#82181c); -webkit-background-clip: text; background-clip: text; color: transparent; } .green{ color:#43853b; font-weight:bold; } .blue{ color:#128b68; font-weight:bold; } 

js

Page({ / * 页面的初始数据 */ data: { classes: ['语文', '数学', '英语', '历史', '地理', '政治', '化学', '物理','生物'] }, / * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, / * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, / * 生命周期函数--监听页面显示 */ onShow: function () { }, / * 生命周期函数--监听页面隐藏 */ onHide: function () { }, / * 生命周期函数--监听页面卸载 */ onUnload: function () { }, / * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, / * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, / * 用户点击右上角分享 */ onShareAppMessage: function () { } }) 

教师列表页

在这里插入图片描述
教师列表页需要从数据库中查询符合条件的教师显示到页面中,点击教师的姓名可以跳转到详情页中

wxml

 
   
    
     
      
      
        名师汇 
       
      
      
       
        
         
         
           { 
          {item.name}} 
          
         
           编号: 
          
         
           { 
          {item.no}} 
          
         
         
         
           科目: 
          
         
           { 
          {item.course}} 
          
         
           性别: 
          
         
           { 
          {item.sex}} 
          
         
           教龄: 
          
         
           { 
          {item.year}} 
          
         
        
       
       
       
         该类别下暂无教师 
        
       
      
     
    
   

wxss

.margin20{ margin-left: 20px; } .margin25{ margin-left: 27px; } 

js

// miniprogram/pages/teacherlist/teacherlist.js wx.cloud.init() const db = wx.cloud.database() const teacherCollection = db.collection('teacher') const _ = db.command Page({ / * 页面的初始数据 */ data: { teacherlist:[], type:"" }, / * 生命周期函数--监听页面加载 */ onLoad: function (options) { console.log(options.name+" "+options.type) console.log(teacherCollection) teacherCollection.where({ course:options.name, }).get().then(res => { console.log(res.data) this.setData({ teacherlist: res.data, type:options.type }) }) }, / * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, / * 生命周期函数--监听页面显示 */ onShow: function () { }, / * 生命周期函数--监听页面隐藏 */ onHide: function () { }, / * 生命周期函数--监听页面卸载 */ onUnload: function () { }, / * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, / * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, / * 用户点击右上角分享 */ onShareAppMessage: function () { } }) 

教师详情页

在这里插入图片描述
详情页比较简单,接收页面传入的ID参数,然后去数据库获取该教师的信息展示到页面中即可

wxml

 
   
    
     
      
       
       
         姓名 
        
       
       
       
         { 
        {teacher.name}} 
        
       
      
      
       
       
         编号 
        
       
       
       
         { 
        {teacher.no}} 
        
       
      
      
       
       
         科目 
        
       
       
       
         { 
        {teacher.course}} 
        
       
      
      
       
       
         性别 
        
       
       
       
         { 
        {teacher.sex}} 
        
       
      
      
       
       
         教龄(年) 
        
       
       
       
         { 
        {teacher.year}} 
        
       
      
      
       
       
         可辅导年级 
        
       
       
       
         { 
        {teacher.grade}} 
        
       
      
      
       
       
         过往辅导成绩 
        
       
       
       
         { 
        {teacher.score}} 
        
       
      
      
       
       
         课时费 
        
       
       
       
         { 
        {teacher.cost}} 
        
       
      
     
    
   

wxss

.flex{ flex-direction: column; } .left{ text-align: left; } 

js

wx.cloud.init() const db = wx.cloud.database() const teacherCollection = db.collection('teacher') const _ = db.command Page({ / * 页面的初始数据 */ data: { teacher:[] }, / * 生命周期函数--监听页面加载 */ onLoad: function (options) { console.log(options.id) teacherCollection.doc(options.id).get({ success: res => { console.log(res.data) this.setData({ teacher:res.data }) } }) }, / * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, / * 生命周期函数--监听页面显示 */ onShow: function () { }, / * 生命周期函数--监听页面隐藏 */ onHide: function () { }, / * 生命周期函数--监听页面卸载 */ onUnload: function () { }, / * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, / * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, / * 用户点击右上角分享 */ onShareAppMessage: function () { }, getUserInfo: function (result) { console.log("111") wx.redirectTo({ url: '../order/order', }) } }) 

我的页面

在这里插入图片描述
我的页面相对复杂一些,因为第一步需要解决的是登录的问题,微信通过button组件增加属性支持点击按钮之后进行登录,获取到登录信息的时候需要获取该用户是否是管理员,如果不是则下边的菜单看不到教师管理和预约管理的功能,如果是管理员就可以维护教师和处理预约的信息,当然了实现这些功能肯定是需要写云函数的,因为只是小程序端的代码是无法完成的。

wxml

 
   
    
     
      
       
        
         
         { 
          {Object.keys(userInfo).length}}  
         
        
          { 
         {userInfo.nickName}} 
         
        
        
         
         微信小程序云开发入门实践  
         
         
          
         
        
        
         
         微信小程序云开发入门实践  
         
         
         微信小程序云开发入门实践  
         
         
         微信小程序云开发入门实践  
         
         
         微信小程序云开发入门实践  
         
        
       
      
     
    
   

wxss

.container{ background: #ffffff; width:100%; } .page-body{ width:100%; } .flex-item{ text-align: center; width:325px; } 

js

// miniprogram/pages/my/my.js const db = wx.cloud.database() const admin = db.collection('admin') const app = getApp(); Page({ / * 页面的初始数据 */ data: { userInfo:{} }, / * 生命周期函数--监听页面加载 */ onLoad: function (options) { const userInfo = app.globalData.userInfo if (userInfo) { admin.where({ openid:userInfo.openid }).count().then(res => { userInfo.isadmin = res.total this.setData({ userInfo: userInfo }) }) .catch(err => { console.error(err) }) } /*wx.getSetting({ success: res => { console.log("-----" + res.authSetting['scope.userInfo']) if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 console.log("已授权" + res.authSetting['scope.userInfo']) wx.getUserInfo({ success: res => { this.setData({ avatarUrl: res.userInfo.avatarUrl, userInfo: res.userInfo }) console.log(Object.keys(this.data.userInfo).length) } }) } } })*/ }, / * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, / * 生命周期函数--监听页面显示 */ onShow: function () { const userInfo = app.globalData.userInfo if (userInfo) { admin.where({ openid: userInfo.openid }).count().then(res => { userInfo.isadmin = res.total this.setData({ userInfo: userInfo }) }) .catch(err => { console.error(err) }) } }, / * 生命周期函数--监听页面隐藏 */ onHide: function () { }, / * 生命周期函数--监听页面卸载 */ onUnload: function () { }, / * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { const userInfo = app.globalData.userInfo if (userInfo) { admin.where({ openid: userInfo.openid }).count().then(res => { userInfo.isadmin = res.total this.setData({ userInfo: userInfo }) }) .catch(err => { console.error(err) }) } }, / * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, / * 用户点击右上角分享 */ onShareAppMessage: function () { }, onGotUserInfo: function (result) { wx.cloud.callFunction({ name: 'login', success: res => { console.log(res.result.dbResult.total) result.detail.userInfo.openid = res.result.OPENID result.detail.userInfo.isadmin = res.result.dbResult.total app.globalData.userInfo = result.detail.userInfo this.setData({ userInfo: result.detail.userInfo }) wx.setStorageSync("userInfo", result.detail.userInfo) } }) } }) 

在这里插入图片描述
预约列表页面主要从数据库查询记录,当预约信息查看后同时更新状态,将状态变更为已读

wxml

 
   
    
     
      
       
        
         
        
        
         
        
       
      
     
    
   

json

{ "usingComponents": { "mp-cells": "../components/cells/cells", "mp-cell": "../components/cell/cell", "mp-slideview": "../components/slideview/slideview" } } 

wxss

/* miniprogram/pages/ordermanage/ordermanage.wxss */ .weui-cell__ft{ color:#43853b!important; } .weui-cells__title{ color:#43853b; } 

js

wx.cloud.init() const db = wx.cloud.database() const subscribeCollection = db.collection('subscribe') const _ = db.command const app = getApp(); Page({ data: { subcribe: {} }, onLoad: function () { subscribeCollection.orderBy('createtime', 'desc').get().then(res => { for (var index in res.data) { var time = res.data[index].createtime; console.log(time) res.data[index].createtime = time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate() } this.setData({ subscribe: res.data, }) }) this.setData({ slideButtons: [{ type: 'warn', text: '删除', extClass: 'test', src: '/page/weui/cell/icon_del.svg', // icon的路径 }], }); }, onShow(){ subscribeCollection.orderBy('createtime', 'desc').get().then(res => { for (var index in res.data) { var time = res.data[index].createtime; console.log(time) res.data[index].createtime = time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate() } this.setData({ subscribe: res.data, }) }) }, slideButtonTap(e) { console.log('slide button tap', e.detail) } }); 

在这里插入图片描述
预约新增页面使用了weui的扩展组件,主要使用了表单,可以很方便的进行校验

wxml

 
   
   
    
     
      
       
         
       
       
         
       
       
         
       
       
         
       
       
         
       
      
     
       地址 
      
      
       
        
          
        
       
      
     
       要求 
      
      
       
        
         
        
       
      
      
       
      
     
    
   

wxss

/* miniprogram/pages/order/order.wxss */ .weui-cells__title{ color:#43853b; } 

js

wx.cloud.init() const db = wx.cloud.database() const orderCollection = db.collection('subscribe') const _ = db.command Component({ data: { showTopTips: false, formData: { }, rules: [{ name: 'class', rules: { required: true, message: '辅导科目是必选项' }, }, { name: 'grade', rules: { required: true, message: '辅导年级是必选项' }, }, { name: 'contactname', rules: { required: true, message: '联系人姓名是必选项' }, }, { name: 'telphone', rules: [{ required: true, message: '手机号必填' }, { mobile: true, message: '手机号格式不对' }], }, { name: 'microno', rules: { required: true, message: '微信号是必选项' }, }] }, methods: { formInputChange(e) { const { field } = e.currentTarget.dataset this.setData({ [`formData.${field}`]: e.detail.value }) }, submitForm() { this.selectComponent('#form').validate((valid, errors) => { console.log('valid', valid, errors) if (!valid) { const firstError = Object.keys(errors) if (firstError.length) { this.setData({ error: errors[firstError[0]].message }) } } else { console.log(this.data.formData) var address =""; var demand = ""; if(this.data.formData.hasOwnProperty('address')){ address = this.data.formData.address; console.log(address) } if (this.data.formData.hasOwnProperty('demand')){ demand = this.data.formData.demand; } orderCollection.add({ // data 字段表示需新增的 JSON 数据 data:{ class:this.data.formData.class, grade:this.data.formData.grade, contactname:this.data.formData.contactname, telphone:this.data.formData.telphone, microno:this.data.formData.microno, address:address, demand:demand, createtime: new Date(), status:0 } }) .then(res => { console.log(res) wx.showToast({ title: '预约成功', icon: 'success', duration: 2000 }) wx.switchTab({ url: '../my/my', }) }) .catch(console.error) } }) } } }); 

json

{ "usingComponents": { "mp-toptips": "../components/toptips/toptips", "mp-cells": "../components/cells/cells", "mp-cell": "../components/cell/cell", "mp-checkbox": "../components/checkbox/checkbox", "mp-checkbox-group": "../components/checkbox-group/checkbox-group", "mp-form": "../components/form/form" } } 

课程总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211794.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:35
下一篇 2026年3月18日 下午9:36


相关推荐

  • 常用的curl命令及参数详解

    前言:经常需要用到curl命令在线上机器中去测试接口,尤其是一些内外网接口、判断线上接口信息等,需要用到curl命令直接测试页面或接口返回值,下面是我常用的curl命令参数及作用:1、curl url作用:获取页面内容或接口响应示例:以爱奇艺视频页领取优惠券为例:curl https://act.vip.iqiyi.com/api/process.action?cb=cb_1540…

    2022年4月8日
    225
  • 2.1.1 操作系统之进程的定义、特征、组成、组织

    文章目录1.进程的定义(1)程序的概念(2)进程的概念(2)进程的定义2.进程的特征3.进程的组成4.进程的组织(1)链接方式(2)索引方式1.进程的定义(1)程序的概念(2)进程的概念一个进程可以包含多个程序(2)进程的定义2.进程的特征3.进程的组成而其中最重要的就是进程控制块PCB(ProcessControlBlock)PCB简介:&nbsp…

    2022年4月13日
    40
  • 关于SM总线控制器驱动的安装

    关于SM总线控制器驱动的安装没有装SM总线控制器的再设备管理器看起来是这样的:虽然说,这个控制器不装对日常简单应用没有多大影响,但是为了保证计算机的性能,避免在使用过程中出现各种奇怪的问题,不装是不行的。下面开始安装,一般的驱动安装也可遵循此过程。首先解压ATISB600南桥驱动。我的版本是7.8的,解压默认再C:\ATI\********然后打开相应文件夹,如下图:红圈画的就是传说中的控制器驱动文件。…

    2022年6月6日
    110
  • SQL服务器操作系统和SQL版本的选择

    SQL服务器操作系统和SQL版本的选择

    2021年8月2日
    55
  • 古典概率习题

    古典概率习题对于至少有一个人中奖 我们都要将其转换为没有人中奖 然后再拿 1 减去这个概率

    2026年3月18日
    2
  • Cursor 1.0:四大核心功能详解,以及国内使用教程

    Cursor 1.0:四大核心功能详解,以及国内使用教程

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号