簡介:個人想自己開發一個小程序玩一下,由於我是后台,前端很久沒有接觸了,所以想用最簡單最快捷的方式去完成這個小程序,然后就買了騰訊雲的小程序解決方案,
自己做的時候發現沒有什么相關博客是買的這個,所以自己也記錄一下,方便有同樣需求的同學。這個解決方案是前端+后台都可以在開發者工具中開發。
1.申請小程序
https://mp.weixin.qq.com/cgi-bin/wx,按步驟來就可以了。
2.接入騰訊雲解決方案
進入微信公眾平台>設置>第三方服務>騰訊雲(點擊開通),然后按流程開通后,會有一個免費的開發環境。
像這樣,由於后台目前只支持PHP和NODE.js,然后我后台用的是node.js+mysql,也是第一次接觸node.js。。。數據庫和一些問題的文檔 騰訊雲這個頁面下面都有
3.使用開發者工具開發
接入騰訊雲后,打開開發者工具在空目錄上新建項目的時候可以選擇快速創建node.js模板項目
騰訊雲里面也有相關文檔,模板項目里也有readme可以看一下,根據文檔修改host、數據庫配置等等。
項目結構:
項目結構如上圖,client為小程序前端代碼,點擊開發者工具上傳按鈕就是上傳前端代碼。
server表示后端代碼,點擊騰訊雲按鈕,里面有 上傳測試代碼 表示上傳后台代碼到服務器。
4.后台開發接口
我是用到了數據庫,首先得連接上mysql,單獨配置了一個文件出來作為連接數據庫對象。
const { mysql: config } = require('./config') const DB = require('knex')({ client: 'mysql', connection: { host: config.host, port: config.port, user: config.user, password: config.pass, database: config.db, charset: config.char, multipleStatements: true }, debug: true, //指明是否開啟debug模式,默認為true表示開啟 pool: { //指明數據庫連接池的大小,默認為{min: 2, max: 10} min: 1, max: 7, } }) module.exports = DB
這個解決方案連數據庫用的knex.js,可以百度搜knex.js文檔,查看操作數據庫的用法,
以上代碼將DB對象導出后,在別的js里面就可以導入使用了,以下是我的一個例子:
const DB = require('../dbConf') const getLists = async ctx => { let params = ctx.request.body; console.log('getLists入參:', params) await DB.select('id', 'user_id', 'item_name', 'item_image', 'item_time', 'amount', 'create_time').from('bill').where('user_id', params.userId).orderByRaw('item_time DESC').limit(params.pageSize).offset(params.startRow * 1) .then((res) => { console.log('getLists出參:', res) ctx.state.data = { msg: 'success', res, params } }) } const insertBill = async ctx => { let params = ctx.request.body; console.log('insertBill入參:', params) await DB.insert({ user_id: params.userId, item_name: params.itemName, item_image: params.itemImage, item_time: params.itemTime, amount: params.amount, create_time: new Date(), item_date: params.itemDate}).into('bill').then((res) => { console.log('insertBill出參:', res) ctx.state.data = { msg: 'success', res, params } }) } module.exports = { getLists, insertBill }
查詢列表和插入列表,最后導出方法,然后將地址配置好,以下是配置地址:
配置好地址之后,前端client里就可以調用了,以下是前端調用例子,先寫一個api.js(名字隨意),
const {host:host} = require('./config.js') wx.setStorageSync('loginState', 0); const wxRequest = (params, url, type = 'application/x-www-form-urlencoded') => { console.log('調用后台接口參數:',params) if (!params.noNeedShow) { wx.showLoading({ title: '加載中...', }) } var data = params.data wx.request({ url, method: params.method || 'POST', data: data, header: { 'Accept': 'application/json', 'Content-Type': type, }, success(res) { console.log('調用后台接口結果:',res) if (res && res.data && (0 == res.data.code)) { params.success(res.data.data, res.data); } else if (res && res.data && (0 != res.data.code)) { console.log('調用接口code不為0,異常',res.data) params.success(res.data.data); params.fail(res.data); } else { params.success(res.data.data); params.fail(res.data); } }, fail(res) { console.log(res) if (params.fail) { params.fail(res); } else { } }, complete(res) { if (!params.noNeedShow) { wx.hideLoading() } if (params.complete) { params.complete(res); } }, }); }; const getBillList = (params) => { wxRequest(params, `${host}/weapp/demo/getLists`); }; const insertBill = (params) => { wxRequest(params, `${host}/weapp/demo/insertBill`); }; const updateBillImage = (params) => { wxRequest(params, `${host}/weapp/demo/updateBillImage`); }; const deleteOneBill = (params) => { wxRequest(params, `${host}/weapp/demo/deleteOneBill`); }; const getHistoryTotal = (params) => { wxRequest(params, `${host}/weapp/demo/getHistoryTotal`); }; const getHistoryTotalByMonth = (params) => { wxRequest(params, `${host}/weapp/demo/getHistoryTotalByMonth`); }; const getPhotos = (params) => { wxRequest(params, `${host}/weapp/photo/getPhotos`); }; const insertPhoto = (params) => { wxRequest(params, `${host}/weapp/photo/insertPhoto`); }; const deletePhoto = (params) => { wxRequest(params, `${host}/weapp/photo/deletePhoto`); }; const saveUserInfo = (params) => { wxRequest(params, `${host}/weapp/user/saveUserInfo`); }; module.exports = { getBillList, saveUserInfo, insertBill, updateBillImage, deleteOneBill, getPhotos, insertPhoto, deletePhoto, getHistoryTotal, getHistoryTotalByMonth };
這個是前端調用接口的一個js,所有的接口都通過wx.requert()方法來調用,然后將調用的方法導出,在別的前端js里就可以統一導入api.js來使用,以下是調用例子:
// pages/history/history.js var qcloud = require('../../vendor/wafer2-client-sdk/index') var config = require('../../config') var util = require('../../utils/util.js') let api = require('../../api') Page({ /** * 頁面的初始數據 */ data: { list:[], onDay:true, userId:'', backImage:'' }, /** * 生命周期函數--監聽頁面加載 */ onLoad: function (options) { console.log('onLoad,userId = ', options.userId) this.setData({ onDay: (options.onDay == "false" ? false : true), backImage: options.backImage, userId: options.userId // userId:54 }) this.getHistoryTotal(options.userId); }, getHistoryTotal: function () { var that = this; let userId = that.data.userId; api.getHistoryTotal({ data: { userId }, noNeedShow: true, success: (data) => { console.log('調用統計賬單接口成功狀態:', data) let result = data.res for (let j = 0; j < result.length; j++) { if (result[j].item_date != null){ result[j].item_date = util.formatDate(new Date(result[j].item_date)) } } that.setData({ list : result }) // that.data.list = result; console.log('列表',that.data.list) }, fail: (error) => { console.log('調用統計賬單接口失敗:', error) } }) } })
以上例子通過api.getHistoryTotal({})調用api.js里的getHistoryTotal方法查詢數據庫。
后台接口寫完記得騰訊雲>上傳測試代碼,然后通過前端調用,可以看到效果。
由於寫的不太好,如果覺得看得不清晰,可以直接把源碼下載下來對應着看,源碼地址:https://git.coding.net/shimedoukeyidia/zhuzi_home.git,有問題歡迎評論溝通。