微信小程序健康管理系统的开发与实现(一)https://developer.aliyun.com/article/1423167
四,核心代码展示
const AdminBiz = require('../../../../biz/admin_biz.js'); const pageHelper = require('../../../../helper/page_helper.js'); const cloudHelper = require('../../../../helper/cloud_helper.js'); Page({ /** * 页面的初始数据 */ data: {}, /** * 生命周期函数--监听页面加载 */ onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //设置搜索菜单 await this._getSearchMenu(); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: async function () {}, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, url: async function (e) { pageHelper.url(e, this); }, bindCommListCmpt: function (e) { pageHelper.commListListener(this, e); }, bindDelTap: async function (e) { if (!AdminBiz.isAdmin(this)) return; let id = pageHelper.dataset(e, 'id'); let params = { id } let callback = async () => { try { let opts = { title: '删除中' } await cloudHelper.callCloudSumbit('admin/user_del', params, opts).then(res => { pageHelper.delListNode(id, this.data.dataList.list, 'USER_MINI_OPENID'); this.data.dataList.total--; this.setData({ dataList: this.data.dataList }); pageHelper.showSuccToast('删除成功'); }); } catch (e) { console.log(e); } } pageHelper.showConfirm('确认删除?删除不可恢复', callback); }, bindStatusTap: async function (e) { if (!AdminBiz.isAdmin(this)) return; let id = pageHelper.dataset(e, 'id'); let status = pageHelper.dataset(e, 'status'); let params = { id, status } try { await cloudHelper.callCloudSumbit('admin/user_status', params).then(res => { pageHelper.modifyListNode(id, this.data.dataList.list, 'USER_STATUS', status, 'USER_MINI_OPENID'); this.setData({ dataList: this.data.dataList }); pageHelper.showSuccToast('设置成功'); }); } catch (e) { console.log(e); } }, _getSearchMenu: async function () { let sortItems = []; let sortMenus = [{ label: '全部', type: '', value: '' }, { label: '正常', type: 'status', value: 1 }, { label: '注册时间正序', type: 'sort', value: 'newasc' }, { label: '注册时间倒序', type: 'sort', value: 'newdesc' }, ] this.setData({ sortItems, sortMenus }) } })
const AdminNewsBiz = require('../../../../biz/admin_news_biz.js'); const AdminBiz = require('../../../../biz/admin_biz.js'); const pageHelper = require('../../../../helper/page_helper.js'); const cloudHelper = require('../../../../helper/cloud_helper.js'); Page({ /** * 页面的初始数据 */ data: {}, /** * 生命周期函数--监听页面加载 */ onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //设置搜索菜单 await this._getSearchMenu(); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: async function () {}, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, url: async function (e) { pageHelper.url(e, this); }, bindCommListCmpt: function (e) { pageHelper.commListListener(this, e); }, bindSortTap: async function (e) { if (!AdminBiz.isAdmin(this)) return; let id = e.currentTarget.dataset.id; let sort = e.currentTarget.dataset.sort; if (!id || !sort) return; let params = { id, sort } try { await cloudHelper.callCloudSumbit('admin/news_sort', params).then(res => { pageHelper.modifyListNode(id, this.data.dataList.list, 'NEWS_HOME', sort); this.setData({ dataList: this.data.dataList }); }); } catch (e) { console.log(e); } }, _del: async function (id, that) { if (!AdminBiz.isAdmin(this)) return; if (!id) return; let params = { id } let callback = async () => { try { let opts = { title: '删除中' } await cloudHelper.callCloudSumbit('admin/news_del', params, opts).then(res => { pageHelper.delListNode(id, that.data.dataList.list, '_id'); that.data.dataList.total--; that.setData({ dataList: that.data.dataList }); pageHelper.showSuccToast('删除成功'); }); } catch (e) { console.log(e); } } pageHelper.showConfirm('确认删除?删除不可恢复', callback); }, bindReviewTap: function (e) { let id = pageHelper.dataset(e, 'id'); wx.navigateTo({ url: pageHelper.fmtURLByPID('/pages/news/detail/news_detail?id=' + id), }); }, bindStatusSelectTap: async function (e) { if (!AdminBiz.isAdmin(this)) return; let itemList = ['启用', '停用', '删除']; let id = pageHelper.dataset(e, 'id'); wx.showActionSheet({ itemList, success: async res => { switch (res.tapIndex) { case 0: { //启用 await this._setStatus(id, 1, this); break; } case 1: { //停止 await this._setStatus(id, 0, this); break; } case 2: { //删除 await this._del(id, this); break; } } }, fail: function (res) {} }) }, _setStatus: async function (id, status, that) { status = Number(status); let params = { id, status } try { await cloudHelper.callCloudSumbit('admin/news_status', params).then(res => { pageHelper.modifyListNode(id, that.data.dataList.list, 'NEWS_STATUS', status, '_id'); that.setData({ dataList: that.data.dataList }); pageHelper.showSuccToast('设置成功'); }); } catch (e) { console.log(e); } }, _getSearchMenu: async function () { let arr = await AdminNewsBiz.getCateList(); let sortItems = []; let sortMenus = [{ label: '全部', type: '', value: '' }, { label: '正常', type: 'status', value: 1 }, { label: '停用', type: 'status', value: 0 }, { label: '首页推荐', type: 'home', value: 0 } ] sortMenus = sortMenus.concat(arr); this.setData({ sortItems, sortMenus }) } })
const AdminBiz = require('../../../../biz/admin_biz.js'); const AdminMeetBiz = require('../../../../biz/admin_meet_biz.js'); const pageHelper = require('../../../../helper/page_helper.js'); const cloudHelper = require('../../../../helper/cloud_helper.js'); Page({ /** * 页面的初始数据 */ data: {}, /** * 生命周期函数--监听页面加载 */ onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //设置搜索菜单 await this._getSearchMenu(); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: async function () {}, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, url: async function (e) { pageHelper.url(e, this); }, bindCommListCmpt: function (e) { pageHelper.commListListener(this, e); }, bindScanTap: function (e) { let meetId = pageHelper.dataset(e, 'id'); let title = encodeURIComponent(pageHelper.dataset(e, 'title')); wx.navigateTo({ url: '../scan/admin_meet_scan?meetId=' + meetId + '&title=' + title, }); }, bindRecordSelectTap: async function (e) { let itemList = ['预约名单', '导出名单Excel文件', '管理员核销预约码', '用户自助签到码']; let meetId = pageHelper.dataset(e, 'id'); let title = encodeURIComponent(pageHelper.dataset(e, 'title')); wx.showActionSheet({ itemList, success: async res => { switch (res.tapIndex) { case 0: { //预约名单 wx.navigateTo({ url: '../record/admin_record_list?meetId=' + meetId + '&title=' + title, }); break; } case 1: { //导出 wx.navigateTo({ url: '../export/admin_join_export?meetId=' + meetId + '&title=' + title, }); break; } case 2: { //核验 this.bindScanTap(e); break; } case 3: { //自助签到码 pageHelper.showModal('请进入「预约名单->名单」, 查看某一时段的「用户自助签到码」') break; } } }, fail: function (res) {} }) }, bindMoreSelectTap: async function (e) { let itemList = ['预览']; let meetId = pageHelper.dataset(e, 'id'); wx.showActionSheet({ itemList, success: async res => { switch (res.tapIndex) { case 0: { //预览 wx.navigateTo({ url: pageHelper.fmtURLByPID('/pages/meet/detail/meet_detail?id=' + meetId), }); break; } } }, fail: function (res) {} }) }, bindStatusSelectTap: async function (e) { let itemList = ['启用', '停止预约 (用户可见)', '关闭 (用户不可见)', '删除', '置顶', '取消置顶']; let meetId = pageHelper.dataset(e, 'id'); wx.showActionSheet({ itemList, success: async res => { switch (res.tapIndex) { case 0: { //启用 await this._setStatus(meetId, 1, this); break; } case 1: { //停止预约 await this._setStatus(meetId, 9, this); break; } case 2: { //关闭 await this._setStatus(meetId, 10, this); break; } case 3: { //删除 await this._del(meetId, this); break; } case 4: { //置顶 await this._setSort(meetId, 0, this); break; } case 5: { //取消置顶 await this._setSort(meetId, 9999, this); break; } } }, fail: function (res) {} }) }, _setSort: async function (meetId, sort, that) { if (!AdminBiz.isAdmin(this)) return; if (!meetId) return; let params = { meetId, sort } try { await cloudHelper.callCloudSumbit('admin/meet_sort', params).then(res => { pageHelper.modifyListNode(meetId, that.data.dataList.list, 'MEET_ORDER', sort); that.setData({ dataList: that.data.dataList }); pageHelper.showSuccToast('设置成功'); }); } catch (e) { console.log(e); } }, _del: async function (meetId, that) { if (!AdminBiz.isAdmin(this)) return; if (!meetId) return; let params = { meetId } let callback = async function () { try { let opts = { title: '删除中' } await cloudHelper.callCloudSumbit('admin/meet_del', params, opts).then(res => { pageHelper.delListNode(meetId, that.data.dataList.list, '_id'); that.data.dataList.total--; that.setData({ dataList: that.data.dataList }); pageHelper.showSuccToast('删除成功'); }); } catch (e) { console.log(e); } } pageHelper.showConfirm('确认删除?删除不可恢复', callback); }, _setStatus: async function (meetId, status, that) { if (!AdminBiz.isAdmin(this)) return; if (!meetId) return; let params = { meetId, status } try { await cloudHelper.callCloudSumbit('admin/meet_status', params).then(res => { pageHelper.modifyListNode(meetId, that.data.dataList.list, 'MEET_STATUS', status, '_id'); that.setData({ dataList: that.data.dataList }); pageHelper.showSuccToast('设置成功'); }); } catch (e) { console.log(e); } }, _getSearchMenu: async function () { let arr = await AdminMeetBiz.getTypeList(); let sortItems = []; let sortMenus = [{ label: '全部', type: '', value: '' }, { label: '使用中', type: 'status', value: 1 }, { label: '已停止', type: 'status', value: 9 }, { label: '已关闭', type: 'status', value: 10 }, ]; sortMenus = sortMenus.concat(arr); this.setData({ sortItems, sortMenus }) } })
五,项目总结
5.1 微信小程序云开发应用
微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。开发者可以使用云开发快速开发小程序、小游戏、公众号网页等,并且原生打通微信开放能力。开发者无需搭建服务器,可免鉴权直接使用平台提供的 API 进行业务开发。使用微信小程序云开发需要先注册然后使用。
在开发者工具的工具栏左侧上部,点击 【云开发】 按钮即可打开云开发控制台,根据提示开通云开发,并且创建一个新的云开发环境。
6-1云开发操作操作
每个环境相互隔离,拥有唯一的环境 ID (拷贝此ID,后面配置会用到),包含独立的数据库实例、存储空间、云函数配置等资源。
6-2云开发操作操作
开通过申请到了云开发环境的ID,即可在小程序中进行按官方文档配置开发。
5.2微信小程序开发者工具应用
腾讯为小程序开发人员提供了一个专业方便的快速构建工具,也就是我们用到的这款小程序开发者工具。从微信小程序官网下载小程序开发者工具安装后打开,需要使用开发者绑定小程序账户的微信扫描登录后打开。打开后的界面如下:
6-3微信开发者工具操作
5.3 NODEJS技术开发应用
Nodejs技术最近几年在前后端分离开发中用的比较多,特别是一些前端开发人员,更喜欢结合Nodejs来进行项目的开发。它是基于Chrom的V8引擎来运行JS端服务程序。原来JS主要定位于前端交互开发的脚本,现在却可以像PHP,JSP一样开发后台服务程序。本项目中对应的后台管理功能就是基于Nodejs来开发的后台程序。下面是后台程序的目录结构:
6-4后台系统目录结构
其中package.json是配置的系统依赖的库,主要是在启动时要加载一些js库以便开发使用。其中project目录下包含controller,model,service三个目录,分别代表三层架构中的控制器,数据模型层,业务层,系统采用三层架构的方式来进行开发实现。
5.4 NPM包管理工具应用
后台开发基于Nodejs开发应用时,需要下载相关的JS依赖库,以便开发使用,我们常用NPM进行依赖库的管理,需要在本地安装配置NPM环境,它相当于J ava中的Maven。本地安装配置后可以使用命查看它是否安装成功:
6-5 NPM版本查看
5.5 MongoDB数据库应用
本健康小程序管理系统的开发基于微信云开发实现,使用了微信云服务器的数据库服务来进行数据存储,它使用的是Mongodb数据库。点击微信开发者工具上面的云开发,可以进入自己申请的云服务列表,选择数据库,可以查看相关的数据库表结构及数据:
6-6 云数据库查看