实践:给女朋友个性化定制应用-体重记录(二)

简介: 此系列的目的是帮助前端新人,熟悉现代前端工程化开发方式与相关技术的使用,普及一些通识内容

前景回顾


上一篇文章,主要阐述了应用前端工程的搭建与部分页面开发

本文简单介绍一下一期剩余的页面(体重记录页)开发,着重阐述后端部分的必要设计


本文涉及内容


  • 体重记录页的开发
  • 初始化后端Node+TypeScript项目
  • 数据库设计
  • 接口设计
  • 云数据库初始化
  • 数据库操作方法封装


体重记录页开发



页面整体上由导航最近一次的记录对比描述历史记录添加数据弹窗等5部分组成


导航


直接使用vant-nav-bar


左按钮返回上一页,右按钮(icon) 唤起添加添加成员的弹窗: van-dialog


<van-nav-bar
  title="体重记录"
  @click-left="handleBack"
  @click-right="handleAddPeople"
  left-text="返回"
  left-arrow
>
  <template #right>
    <van-icon name="plus" size="18" />
  </template>
</van-nav-bar>


效果


网络异常,图片无法展示
|


引入Dialog组件注意: 由于Dialog支持直接当作方法使用Dialog(options),再当作组件注册时与其它组件不太一样:


src/utils/vantUI.ts


import { Button, Dialog } from 'vant'
const conponents = [Button]
export default function mountVantUI(app: App<Element>) {
  conponents.forEach((c) => {
    app.component(c.name, c)
  })
  // 特别对待
  app.component(Dialog.Component.name, Dialog.Component)
}


最近一次的记录


展示一下时间与体重即可


<h2 class="current-time">2021-06-15 12:00:00</h2>
<h1 class="current-weight">48.12<span>公斤</span></h1>


效果


网络异常,图片无法展示
|


对比描述


包含最新的一次记录


  • 上一次比较
  • 与今天第一次比较
  • 与本月第一次比较


展示间隔的时间,并反应上升/下降的体重


页面结构


<p class="rank" v-for="(t, idx) in overviewData" :key="idx">
  {{ t.text }}
  <span :class="t.symbol"></span>
  <span class="res">{{ t.res }}</span>
</p>
<!-- 渲染结果示例 -->
<p class="rank">
  与上一次比较(5小时前)
  <span class="add"></span>
  <span class="res">5 公斤</span>
</p>


效果


网络异常,图片无法展示
|


其中↑与↓的表示采用伪元素::after表示


.dec::after {
    content: '🠐';
    color: green;
    transform: rotate(-90deg);
  }
  .inc::after {
    content: '🠖';
    color: #ff6034;
    transform: rotate(-90deg);
  }


日期差值计算的工具方法


const ONE_SECONDS = 1000
const ONE_MINUTE = ONE_SECONDS * 60
const ONE_HOUR = ONE_MINUTE * 60
const ONE_DAY = ONE_HOUR * 24
function getTimeDiffDes(d1: Date, d2: Date) {
  const diff = d1.getTime() - d2.getTime()
  //   天
  if (diff / ONE_DAY >= 1) {
    return `${Math.round(diff / ONE_DAY)}天前`
  }
  // 小时
  if (diff / ONE_HOUR >= 1) {
    return `${Math.round(diff / ONE_HOUR)}小时前`
  }
  // 分钟
  if (diff / ONE_MINUTE >= 1) {
    return `${Math.round(diff / ONE_MINUTE)}分钟前`
  }
  // 秒
  return `${Math.round(diff / ONE_SECONDS)}秒前`
}


历史数据展示


直接套用Vant的 van-swipe-cellvan-cell


<van-swipe-cell v-for="(t, idx) in weights" :key="idx">
  <van-cell :border="false" :title="formatDate(t.date)">
    {{ t.weight }}
  </van-cell>
  <template #right>
    <van-button @click="hadnleDeleteWeight(idx)" square type="danger" text="删除" />
  </template>
</van-swipe-cell>


效果


网络异常,图片无法展示
|


页面最终效果


网络异常,图片无法展示
|



初始化后端工程


直接使用搭建的ATQQ/node-server模板初始化项目


网络异常,图片无法展示
|


模板工程简介


网络异常,图片无法展示
|


数据库设计


使用: 腾讯云开发CloudBase提供的云数据库 (文档型数据库)

这样从头到尾都不需要买云服务器


相关需求简单回顾


  • 短信验证码登录
  • 支持同时记录多个人的数据
  • 每个数据包含 日期体重两部分内容


简单捋一下思路,使用三张表用户表(user)成员表(family)记录表(record),具体设计如下


用户表-user


字段 类型 描述
userId String 唯一标识
phone String 手机号
joinTime Date 注册时间


成员表-family


字段 类型 描述
familyId String 唯一标识
userId String 关联创建用户
name String 成员名称


记录表-record


字段 类型 描述
recordId String 唯一标识
familyId String 关联成员
userId String 关联创建用户
weight Number 体重
date Date 日期


初始化云数据库


服务端使用Node.js开发,使用云开发提供的Node SDK初始化集合(表)


安装依赖


yarn add @cloudbase/node-sdk


初始化集合


const cloudbase = require('@cloudbase/node-sdk')
const app = cloudbase.init({
    secretId:process.env.secretId,
    secretKey:process.env.secretKey,
    env:process.env.envId
})
const db = app.database();
db.createCollection('user')
db.createCollection('family')
db.createCollection('record')


可以在CloudBase-数据库面板看到结果:


网络异常,图片无法展示
|


接口设计


按数据库对接口进行分类,这里只阐述请求方法与路径

使用Eolinker管理与测试接口:此处查看完整接口设计


User


方法 路径 描述
POST /user/login 用户登录
GET /user/code 获取登录验证码


Family


方法 路径 描述
POST /family/add 添加成员


Record


方法 路径 描述
POST /record/:familyId 添加记录
DELETE /record/:recordId 删除记录


后端开发


数据库操作方法封装


根据文档云开发 CloudBase > 开发指南 > 数据库 编写


JS版本


const cloudbase = require('@cloudbase/node-sdk')
const app = cloudbase.init({
    secretId:process.env.secretId,
    secretKey:process.env.secretKey,
    env:process.env.envId
})
const db = app.database();
function insertDocument(collection, data) {
    return db.collection(collection).add(data)
}
function deleteDocument(collection, query) {
    return db.collection(collection).where(query).remove()
}
function findDocument(collection, query) {
    return db.collection(collection).where(query).get()
}
function updateDocument(collection, query, data) {
    return db.collection(collection).where(query).update(data)
}


TS版本


import cloudbase from '@cloudbase/node-sdk'
const app = cloudbase.init({
    secretId: process.env.secretId,
    secretKey: process.env.secretKey,
    env: process.env.envId
})
export const db = app.database()
export function insertDocument<T>(collection: string, data: T | T[]) {
    return db.collection(collection).add(data)
}
export function deleteDocument(collection: string, query: any) {
    return db.collection(collection).where(query).remove()
}
export function findDocument(collection: string, query: any) {
    return db.collection(collection).where(query).get()
}
export function updateDocument<T>(collection: string, query: any, data:T) {
    return db.collection(collection).where(query).update(data)
}


未完待续


篇幅有限,下一章节再介绍后端部分的详细实现与前后端对接(/(ㄒoㄒ)/~~,主要还是没码完)


资料汇总



相关文章
|
数据挖掘 定位技术
男性多项身体维度数据探索
男性多项身体维度数据探索
336 0
|
2月前
|
搜索推荐 Java API
打造个性化天气应用:从概念到实现
【8月更文挑战第51天】在这篇文章中,我们将一起探索如何将一个天气应用的概念转化为现实。我们将深入讨论移动应用开发的核心概念,包括设计思路、技术选型、以及实际编码过程。通过一个简单的天气应用示例,你将学会如何利用现代移动开发工具和框架来创建自己的应用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一条清晰的道路,帮助你理解并实践移动应用开发。
62 17
|
4月前
|
搜索推荐 C语言
青年歌手大赛:实时评分统计与分析程序设计
青年歌手大赛评分系统:C语言实现平均分计算(剔除最高与最低分) 在青年歌手大赛中,为了确保评分的公平性和准确性,本程序采用C语言设计了一套评分统计方案。该方案的核心功能是在收集10位评委对一位歌手的评分后,自动剔除一个最高分和一个最低分,然后计算剩余8个有效评分的平均值。
|
4月前
|
存储 C语言 索引
【实战编程】学生信息管理系统:一键实现数据插入、智能排序、精准查询与成绩统计(附完整源码,即学即用!)
结构体数组是C语言中一种复合数据类型,它结合了结构体的灵活性和数组的有序集合特性,允许你定义一组具有相同结构的数据项。结构体定义了一组不同数据类型的变量集合,而结构体数组则是这种结构的连续内存块,每个元素都是该结构类型的实例。这种方式特别适合管理具有相似属性的对象集合,如学生信息、员工记录等。
|
4月前
|
数据可视化 数据挖掘
问卷填写率优化:吸引更多受访者的秘诀
**摘要:** 提升问卷填写率的关键在于设计简洁的问卷、选择恰当的分发渠道和设置激励措施。确保问题清晰无歧义,视觉呈现吸引人。利用社交媒体、定时发送及鼓励分享来扩大覆盖。提供匹配受众兴趣的奖励,如小礼品或服务优惠,强调参与的公益价值,以及提供即时反馈以增强参与感。理解和尊重目标受众,以提高数据收集的效率和质量。
46 0
|
6月前
|
机器学习/深度学习 算法 数据可视化
数据报告分享|WEKA贝叶斯网络挖掘学校在校人数影响因素数据分类模型
数据报告分享|WEKA贝叶斯网络挖掘学校在校人数影响因素数据分类模型
|
NoSQL 定位技术 数据库
GIS如何分析台风影响范围和受灾人数
GIS如何分析台风影响范围和受灾人数
152 0
|
机器学习/深度学习 搜索推荐
《蘑菇街广告的排序:从历史数据学习到个性化强化学习》电子版地址
蘑菇街广告的排序:从历史数据学习到个性化强化学习
69 0
《蘑菇街广告的排序:从历史数据学习到个性化强化学习》电子版地址
|
机器学习/深度学习 数据采集 人工智能
『航班乘客满意度』场景数据分析建模与业务归因解释 ⛵
本文结合航空出行的场景,使用机器学习建模,详细分析了航班乘客满意度的影响因素:机上Wi-Fi服务、在线登机、机上娱乐质量、餐饮、座椅舒适度、机舱清洁度和腿部空间等。
449 0
『航班乘客满意度』场景数据分析建模与业务归因解释 ⛵
|
分布式计算 算法 数据可视化
房源画像实验演示(上)|学习笔记
快速学习房源画像实验演示(上)
512 0
房源画像实验演示(上)|学习笔记