毕业设计:微信小程序健康管理系统的开发与实现(二)

简介: 毕业设计:微信小程序健康管理系统的开发与实现

毕业设计:微信小程序健康管理系统的开发与实现(一)https://developer.aliyun.com/article/1423271


四,核心代码展示

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 云数据库查看

相关文章
|
4月前
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
967 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
2月前
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
118 0
|
6月前
|
存储 移动开发 小程序
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
基于开源技术栈构建的校园圈子系统小程序,整合社交与生活服务功能,涵盖兴趣圈子、私信聊天、资料共享、二手交易、兼职跑腿等六大核心模块。通过多端账号同步(微信公众号/小程序/H5),实现数据实时交互,满足学生群体的多元化需求。项目精准锚定校园市场,以“社交+服务”双轮驱动,提供一站式解决方案,支持快速部署与多校区运营,同时具备广告、佣金、会员等多元变现能力,是打造校园生态的理想工具。
534 2
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
|
5月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
416 12
|
5月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
5月前
|
人工智能 开发框架 小程序
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
|
5月前
|
人工智能 小程序 NoSQL
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
|
5月前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
5月前
|
小程序 UED
拓展校友网络的创新解决方案:校园论坛圈子小程序+跑腿+二手市场系统
这是一款基于小程序的校园跑腿服务平台,支持多种注册登录方式、下单支付、跑腿接单配送、订单跟踪评价及物流查询功能,并配备客服模块提升用户体验。系统包含用户、客服、物流、跑腿员和订单五大核心模块,功能完善。此外,平台还拓展了校友网络功能,如信息咨询发布、校园社区建设和活动组织等,旨在增强校友互动与联系,形成紧密的校友生态。
150 4
|
6月前
|
人工智能 编解码 小程序
【一步步开发AI运动小程序】二十、AI运动小程序如何适配相机全屏模式?
本文探讨了小程序`camera`组件在全屏模式下的适配问题及其解决方案。由于`camera`组件存在预览图像裁切特性,可能导致入镜检测与预览不一致、骨骼图与人体不重合等问题。通过分析其裁剪逻辑(长边按比缩放,短边居中裁切),我们提供了计算裁剪比例和留白的适配方法,并优化了插件特性以支持全屏应用。同时,文章还讨论了全屏模式可能带来的副作用,如人体可视区域变小、检测范围变化及抽帧帧率下降等,并给出了改进建议。该方案适用于云上赛事、健身锻炼、AI体测、AR互动等场景,助力提升用户体验和UI布局合理性。

热门文章

最新文章