畢業(yè)設(shè)計:微信小程序健康管理系統(tǒng)的開發(fā)與實現(xiàn)
項目編號:BS-XCX-006
一,項目簡介
信息化技術(shù)在目前的中國,己得到普遍應(yīng)用,涉及到民生的各個方面和角度,教育上的信息化應(yīng)用、醫(yī)療上的信息改革、交通上的信息化普及等等,業(yè)己顯示中國在向科技強國的方向前進。
?? ?中國經(jīng)濟水平的提升也讓中國人民的日子富裕起來了,富裕生活的開始也讓老百姓的健康生活日益重視起來了,對健康知識的渴求,對健康體檢的要求也越來越多。如何利用現(xiàn)代化技術(shù)手段,基于移動互聯(lián)網(wǎng)技術(shù),讓老百姓更加方便快捷的獲得健康知識,方便進行在線預(yù)約體檢,這就是本系統(tǒng)要著重解決的問題。
??? 經(jīng)過調(diào)查和走訪研發(fā)的這套在線健康管理系統(tǒng),采用微信小程序云開發(fā)實現(xiàn),基于Mongodb數(shù)據(jù)庫進行數(shù)據(jù)存儲,前端使用微信小程序開發(fā)實現(xiàn),后端基于Nodejs開發(fā)實現(xiàn)。系統(tǒng)前端用戶主要實現(xiàn)查看新聞通知、體檢知識、在線體檢預(yù)約、查看我的預(yù)約、修改個人資料等。后臺主要實現(xiàn)用戶管理、內(nèi)容管理、活動和預(yù)約管理、統(tǒng)計預(yù)約用戶數(shù)等功能。這套系統(tǒng)的上線對于人們健康的管理和體檢預(yù)約都有很大幫助。
經(jīng)過對微信小程序健康管理系統(tǒng)的需求分析,總結(jié)出了系統(tǒng)各類用戶角色需要的功能模塊,進行了基本的功能模塊設(shè)計,具體的各角色相關(guān)的功能模塊如下圖3-1所示。

圖3-1 健康管理功能結(jié)構(gòu)圖
? ?前端用戶可以通過分享的二維碼掃描登陸系統(tǒng),此時經(jīng)過用戶授權(quán)后會自動使用用戶的微信賬戶注冊登陸小程序。登陸小程序健康管理系統(tǒng)后可以進行如下功能操作:
個人資料維護:可以修改個人的相關(guān)資料信息,填寫姓名、手機號、城市等相關(guān)信息。
動態(tài)瀏覽:可以瀏覽后臺發(fā)布的健康新聞動態(tài)信息
體檢知識瀏覽:可以瀏覽后臺發(fā)布的體檢知識和健康知識信息。
體檢預(yù)約:可以根據(jù)自己的需要預(yù)約后臺發(fā)布的體檢,首先查詢可預(yù)約的時間段,然后預(yù)約指定的時間去進行體檢。
我的預(yù)約:可以查看自己的預(yù)約信息和記錄,并可以進行取消操作,預(yù)約會生成預(yù)約碼,去體檢時可以根據(jù)預(yù)約碼進行核銷。
??? 后臺用戶登陸后可以進行健康管理系統(tǒng)的業(yè)務(wù)數(shù)據(jù)管理操作,主要可以進行的功能操作如下:
??? 1、用戶管理:可以管理前端注冊的小程序用戶信息,進行相應(yīng)的數(shù)據(jù)查看和導(dǎo)出操作。
??? 2、內(nèi)容管理:在內(nèi)容管理查獲塊,主要進行動態(tài)新聞和體檢知識的發(fā)布、編輯、修改狀態(tài)、預(yù)覽和上首頁的操作,上首頁的功能類似于置頂操作。
??? 3、預(yù)約管理:可以發(fā)布新的預(yù)約信息,并可以對己發(fā)布的預(yù)約信息進行修改和狀態(tài)的設(shè)置,同時可以查看前端小程序用戶的預(yù)約信息,并可以進行預(yù)約核銷操作。
? ??4、管理員操作日志:主要查看管理員的操作日志信息。
??? 5、信息統(tǒng)計管理:主要統(tǒng)計并查看預(yù)約數(shù)、用戶數(shù)、文章數(shù)等相關(guān)信息。
?小程序健康管理系統(tǒng)的業(yè)務(wù)數(shù)據(jù)主要通過云開發(fā)平臺的mongodb 數(shù)據(jù)庫進行存儲,數(shù)據(jù)庫的結(jié)構(gòu)依據(jù)于業(yè)務(wù)需求分析抽像出相關(guān)的業(yè)務(wù)實體ER圖,然后根據(jù)實體模型圖轉(zhuǎn)換為具體的表結(jié)構(gòu),這是系統(tǒng)分析中很重要的一步,數(shù)據(jù)結(jié)構(gòu)的設(shè)計關(guān)系到系統(tǒng)后期數(shù)據(jù)存儲和查詢的性能,對整個體系統(tǒng)影響較大,所以在數(shù)據(jù)庫分析和設(shè)計要遵循基于的三大范式原則,下面來展示一下實體數(shù)據(jù)模型和具體的表結(jié)構(gòu)信息。
?? 3.3.1 概念數(shù)據(jù)模型
根據(jù)微信點餐系統(tǒng)的功能分析,抽象出其相關(guān)業(yè)務(wù)數(shù)據(jù)實體的實體數(shù)據(jù)模型,具體展示如下:
1、管理員信息實體:主要分析得出小程序后臺管理員的信息實體屬性,主要有主鍵,名字,電話等相關(guān)信息組成,具體結(jié)構(gòu)如下圖所示:
??????
3-2 管理員信息實體
???? 2、用戶信息實體:主要存儲前端注冊的用戶信息,前端小程序用戶使用微信注冊登陸后可以在系統(tǒng)中修改個人的基本信息,主要包含姓名、電話、城市等信息。

3-3 用戶信息實體
????? 3、新聞信息實體:主要存儲管理員在后臺發(fā)布的關(guān)于體檢動態(tài)的相關(guān)內(nèi)容,以及體檢知識的相關(guān)信息,便于居民快速通過手機獲得健康相關(guān)的知識和體檢知識,主要包含標題、內(nèi)容、狀態(tài)等信息。

3-4 新聞信息實體
????? 4、用戶預(yù)約體檢實體類:主要存儲用戶在線預(yù)約體檢信息,內(nèi)容包含用戶編號、預(yù)約日期、開始時間段、結(jié)束時間段、核驗碼等信息。

3-5 預(yù)約信息實體
???? 5、管理員操作日志信息:主要存儲管理員后臺操作的相關(guān)日志,以便于進行追蹤,主要包含用戶ID、操作類型、時間、IP信息等

3-6 管理員操作信息實體
??? 6、發(fā)布預(yù)約體檢信息實體:主要存儲管理員發(fā)布的預(yù)約體檢的設(shè)置信息,主要包含管理員編號,預(yù)約樣式設(shè)置,分類編號,狀態(tài)等信息。

3-7 發(fā)布預(yù)約信息實體
二,環(huán)境介紹
語言環(huán)境:Nodejs
數(shù)據(jù)庫:Mongodb數(shù)據(jù)庫
開發(fā)工具:IDEA或eclipse
微信小程序云開發(fā)
三,系統(tǒng)展示
3.1 前端用戶功能模塊的展示
3.1.1 前臺首頁展示
?? 健康管理系統(tǒng)的前端主要就是實現(xiàn)動態(tài)信息查詢、體檢知識學(xué)習(xí)、在線預(yù)約體檢的相關(guān)功能。具體操作界面展示如下圖4-1所示。

圖4-1 健康管理首頁界面
3.1.2 最新動態(tài)瀏覽模塊
前端用戶進入健康管理系統(tǒng)進入動態(tài)瀏覽菜單即可查看管理員在后臺發(fā)布的健康動態(tài)新聞信息,具體如下圖4-2所示:

圖4-2 動態(tài)新聞瀏覽界面
3.1.3體檢知識瀏覽模塊
??? 小程序健康管理系統(tǒng)前臺用戶登陸系統(tǒng)后可以點擊首頁或下面的體檢知識菜單進入體檢知識文章列表頁面。具體展示界面如下圖4-3所示。

圖4-3 體檢知識列表界面
3.1.4 體檢套餐列表模塊
??? 小程序健康管理系統(tǒng)前臺用戶登陸系統(tǒng)后,可以在首頁點擊進入體檢預(yù)約模塊進行在線預(yù)約。進入列表顯示當(dāng)前可以預(yù)約的體檢套餐。相關(guān)體檢展示操作界面如下圖4-4所示。

圖4-4體檢列表展示界面
3.1.5在線預(yù)約體檢功能模塊
??? 小程序健康管理前臺用戶在預(yù)約體檢的列表中選擇要預(yù)約的體檢套餐后進入預(yù)約界面,可以查看預(yù)約須知,然后進入預(yù)約時間選擇時間段進行預(yù)約。在線預(yù)約如下圖4-5、4-6、4-7所示。

圖4-5前臺用戶在線預(yù)約操作界面

圖4-6前臺用戶在線預(yù)約操作界面
??? 提交預(yù)約成功后,可顯示預(yù)約信息并展示二維碼,二維碼可以供體檢時管理員核銷預(yù)約使用,具體展示如下:
圖4-7預(yù)約成功信息界面
3.1.6個人信息管理功能模塊
???? 在我的功能模塊中主要可以進行個人信息的修改管理,個人預(yù)約信息的查詢管理等功能,具體展示如下圖4-8所示:

圖4-8我的功能模塊
?????? 點擊個人信息修改可以修改個人信息,具體如下圖4-9所示:

圖4-9個人資料修改功能模塊
點擊我的預(yù)約可以查看個人預(yù)約的體檢信息,可以查看詳情以及取消預(yù)約操作,具體展示如下圖4-10所示:

圖4-10我的預(yù)約查看模塊
3.2后臺功能模塊的展示
3.2.1用戶登錄功能
??? 小程序健康管理系統(tǒng)后臺用戶登陸后,方可授權(quán)進行相關(guān)信息的管理功能。登陸界面如下圖4-11所示。

圖4-11后臺用戶登錄操作界面
3.2.2后臺管理主界面
??? 小程序健康管理系統(tǒng)管理員用戶登陸系統(tǒng)后,可以進入后臺主界面管理菜單進行相應(yīng)信息管理。主要包含用戶管理、預(yù)約管理、內(nèi)容管理、信息統(tǒng)計等相關(guān)功能,后臺管理操作主界面如下圖4-12所示:

圖4-12后臺管理功能界面圖
3.2.3 用戶管理操作UI
??? 小程序健康管理員用戶登陸系統(tǒng)后,可以對前端注冊的用戶信息進行相應(yīng)的管理操作。其中主要包含用戶的查詢、刪除、導(dǎo)出資料、搜索信息等功能。用戶信息管理操作界面如下圖4-13所示。

圖4-13用戶管理功能UI界面
3.2.4 后臺餐品訂單管理操作UI
??? 小程序健康管理系統(tǒng)管理員用戶登陸系統(tǒng)后,可以對預(yù)約體檢信息進行管理。其中主要包含發(fā)布體檢預(yù)約、設(shè)置修改體檢預(yù)約、查看己預(yù)約名單、核銷預(yù)約名單、設(shè)置停用體檢預(yù)約等。體檢預(yù)約信息管理操作界面如下圖4-14所示。

圖4-14體檢預(yù)約管理功能UI界面
3.2.5 內(nèi)容管理操作UI
??? 小程序健康管理員用戶登陸系統(tǒng)后,可以對己發(fā)布的動態(tài)信息、體檢知識進行管理操作,也可以發(fā)布新的文章內(nèi)容并設(shè)置到首頁展示。內(nèi)容管理界面如下圖4-15所示。
圖4-15內(nèi)容管理功能UI界面
3.2.6 日志管理操作UI
??? 小程序健康管理員用戶登陸系統(tǒng)后,在后臺可以分類查看用戶的系統(tǒng)操作日志。日志操作管理界面如下圖4-16所示。
圖4-16日志查看功能UI界面
四,核心代碼展示
const AdminBiz = require('../../../../biz/admin_biz.js');const pageHelper = require('../../../../helper/page_helper.js');const cloudHelper = require('../../../../helper/cloud_helper.js');Page({ /**
* 頁面的初始數(shù)據(jù)
*/
data: {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面加載
*/
onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //設(shè)置搜索菜單
await this._getSearchMenu();
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
*/
onReady: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面顯示
*/
onShow: async function () {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面隱藏
*/
onHide: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面卸載
*/
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('確認刪除?刪除不可恢復(fù)', 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('設(shè)置成功');
});
} 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({ /**
* 頁面的初始數(shù)據(jù)
*/
data: {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面加載
*/
onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //設(shè)置搜索菜單
await this._getSearchMenu();
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
*/
onReady: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面顯示
*/
onShow: async function () {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面隱藏
*/
onHide: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面卸載
*/
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('確認刪除?刪除不可恢復(fù)', 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('設(shè)置成功');
});
} 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({ /**
* 頁面的初始數(shù)據(jù)
*/
data: {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面加載
*/
onLoad: async function (options) { if (!AdminBiz.isAdmin(this)) return; //設(shè)置搜索菜單
await this._getSearchMenu();
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
*/
onReady: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面顯示
*/
onShow: async function () {}, /**
* 生命周期函數(shù)--監(jiān)聽頁面隱藏
*/
onHide: function () {
}, /**
* 生命周期函數(shù)--監(jiān)聽頁面卸載
*/
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 = ['預(yù)約名單', '導(dǎo)出名單Excel文件', '管理員核銷預(yù)約碼', '用戶自助簽到碼']; let meetId = pageHelper.dataset(e, 'id'); let title = encodeURIComponent(pageHelper.dataset(e, 'title'));
wx.showActionSheet({
itemList,
success: async res => { switch (res.tapIndex) { case 0: { //預(yù)約名單
wx.navigateTo({
url: '../record/admin_record_list?meetId=' + meetId + '&title=' + title,
}); break;
} case 1: { //導(dǎo)出
wx.navigateTo({
url: '../export/admin_join_export?meetId=' + meetId + '&title=' + title,
}); break;
} case 2: { //核驗
this.bindScanTap(e); break;
} case 3: { //自助簽到碼
pageHelper.showModal('請進入「預(yù)約名單->名單」, 查看某一時段的「用戶自助簽到碼」') break;
}
}
},
fail: function (res) {}
})
},
bindMoreSelectTap: async function (e) { let itemList = ['預(yù)覽']; let meetId = pageHelper.dataset(e, 'id');
wx.showActionSheet({
itemList,
success: async res => { switch (res.tapIndex) { case 0: { //預(yù)覽
wx.navigateTo({
url: pageHelper.fmtURLByPID('/pages/meet/detail/meet_detail?id=' + meetId),
}); break;
}
}
},
fail: function (res) {}
})
},
bindStatusSelectTap: async function (e) { let itemList = ['啟用', '停止預(yù)約 (用戶可見)', '關(guān)閉 (用戶不可見)', '刪除', '置頂', '取消置頂']; 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: { //停止預(yù)約
await this._setStatus(meetId, 9, this); break;
} case 2: { //關(guān)閉
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('設(shè)置成功');
});
} 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('確認刪除?刪除不可恢復(fù)', 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('設(shè)置成功');
});
} 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: '已關(guān)閉',
type: 'status',
value: 10
},
];
sortMenus = sortMenus.concat(arr); this.setData({
sortItems,
sortMenus
})
}
})
五,項目總結(jié)
5.1 微信小程序云開發(fā)應(yīng)用
微信云開發(fā)是微信團隊聯(lián)合騰訊云推出的專業(yè)的小程序開發(fā)服務(wù)。開發(fā)者可以使用云開發(fā)快速開發(fā)小程序、小游戲、公眾號網(wǎng)頁等,并且原生打通微信開放能力。開發(fā)者無需搭建服務(wù)器,可免鑒權(quán)直接使用平臺提供的 API 進行業(yè)務(wù)開發(fā)。使用微信小程序云開發(fā)需要先注冊然后使用。
??? 在開發(fā)者工具的工具欄左側(cè)上部,點擊 【云開發(fā)】 按鈕即可打開云開發(fā)控制臺,根據(jù)提示開通云開發(fā),并且創(chuàng)建一個新的云開發(fā)環(huán)境。
6-1云開發(fā)操作操作
??? 每個環(huán)境相互隔離,擁有唯一的環(huán)境 ID (拷貝此ID,后面配置會用到),包含獨立的數(shù)據(jù)庫實例、存儲空間、云函數(shù)配置等資源。
6-2云開發(fā)操作操作
開通過申請到了云開發(fā)環(huán)境的ID,即可在小程序中進行按官方文檔配置開發(fā)。
5.2微信小程序開發(fā)者工具應(yīng)用
騰訊為小程序開發(fā)人員提供了一個專業(yè)方便的快速構(gòu)建工具,也就是我們用到的這款小程序開發(fā)者工具。從微信小程序官網(wǎng)下載小程序開發(fā)者工具安裝后打開,需要使用開發(fā)者綁定小程序賬戶的微信掃描登錄后打開。打開后的界面如下:
6-3微信開發(fā)者工具操作
5.3 NODEJS技術(shù)開發(fā)應(yīng)用?
Nodejs技術(shù)最近幾年在前后端分離開發(fā)中用的比較多,特別是一些前端開發(fā)人員,更喜歡結(jié)合Nodejs來進行項目的開發(fā)。它是基于Chrom的V8引擎來運行JS端服務(wù)程序。原來JS主要定位于前端交互開發(fā)的腳本,現(xiàn)在卻可以像PHP,JSP一樣開發(fā)后臺服務(wù)程序。本項目中對應(yīng)的后臺管理功能就是基于Nodejs來開發(fā)的后臺程序。下面是后臺程序的目錄結(jié)構(gòu):
6-4后臺系統(tǒng)目錄結(jié)構(gòu)
??? 其中package.json是配置的系統(tǒng)依賴的庫,主要是在啟動時要加載一些js庫以便開發(fā)使用。其中project目錄下包含controller,model,service三個目錄,分別代表三層架構(gòu)中的控制器,數(shù)據(jù)模型層,業(yè)務(wù)層,系統(tǒng)采用三層架構(gòu)的方式來進行開發(fā)實現(xiàn)。
5.4 NPM包管理工具應(yīng)用
后臺開發(fā)基于Nodejs開發(fā)應(yīng)用時,需要下載相關(guān)的JS依賴庫,以便開發(fā)使用,我們常用NPM進行依賴庫的管理,需要在本地安裝配置NPM環(huán)境,它相當(dāng)于J ava中的Maven。本地安裝配置后可以使用命查看它是否安裝成功:
6-5 NPM版本查看
5.5 MongoDB數(shù)據(jù)庫應(yīng)用
本健康小程序管理系統(tǒng)的開發(fā)基于微信云開發(fā)實現(xiàn),使用了微信云服務(wù)器的數(shù)據(jù)庫服務(wù)來進行數(shù)據(jù)存儲,它使用的是Mongodb數(shù)據(jù)庫。點擊微信開發(fā)者工具上面的云開發(fā),可以進入自己申請的云服務(wù)列表,選擇數(shù)據(jù)庫,可以查看相關(guān)的數(shù)據(jù)庫表結(jié)構(gòu)及數(shù)據(jù):
6-6 云數(shù)據(jù)庫查看