家校通小程序实战教程02口令管理
目录
- 1 创建数据源
- 2 搭建后台功能
- 3 生成口令
- 4 调用API
- 总结
我们的小程序上线之后,必然面临家长要加入的问题。微搭有登录验证的功能,但是手机验证的机制是,如果你未注册就给你自动注册一个账号,如果以注册了收到验证码就可以登录系统。
这种机制的弊端是,只要打开小程序,输入手机号就可以加入,这样就导致会有不是该班级的家长加入。
为了避免这种问题,在家长加入之前,我们要求家长输入班级口令,比对通过才可以加入。本篇我们就讲解一下口令如何创建、如何分发、如何验证。
1 创建数据源
在设计口令的时候,我们有两种方案,一种是直接在班级表添加一列,来填写我们的口令。家长加入的时候直接根据所在班级的字段进行比对,这样验证比较快速。
这种方案的问题是后续要让口令作废,新添加口令就不太方便。
第二种方案是要加一张口令表,每次生成口令的时候添加一条数据,还可以设置口令的状态,有效、失效。这种方案的好处是万一口令被泄露了,还可以及时禁用。缺点呢就是多了一张表,在查询的时候需要额外去口令表获取数据。
但是出于数据安全的角度,我们还是选择使用单独写表的方案。
点击云数据库,点击+号创建口令表
输入数据模型的名称班级口令表
点击添加字段,输入班级口令,类型选择文本
继续添加字段,输入口令状态,类型选择枚举
点击立即创建,创建枚举类型,选项包含有效、失效
继续添加字段,填写班级,数据类型选择关联关系(新),关联模型选择班级,班级表内字段填写班级口令关联,班级表内字段标识用拼音的首字母就可以,填写bjklgl,关联类型选择多对一
这里为什么要选择多对一,你可以想一下谁是一的一方,一的一方表示主表,主表通常都是唯一的不允许有重复记录。我们的班级表就是这种特点,一个学校不可能有两个一年级五班
多的一方表示子表,子表表示记录可以重复,比如我们的口令,我们一个班级可以设置多个口令,但是只有一个口令有效
在这块选择关系的地方是特别迷惑的地方,该选哪个你就按照我提供的这个思路自己问一下,一问就会有答案
填写好字段之后,就可以设置数据的权限
2 搭建后台功能
数据源设置好了之后,我们就可以搭建后台功能了。打开我们的后台应用,点击创建页面
选择表格与表单模板,数据模型选择班级口令表,页面布局选择左侧导航布局
创建好页面之后,我们需要在班级管理列表的操作列上增加一个口令的按钮,切换到班级列表,选中数据表格组件
修改按钮的名字,改成口令,类型选择链接
在点击口令的时候,我们需要打开班级口令的列表,需要传入一个班级的id信息。切换到班级口令列表页面,选中页面组件,在右侧的页面URL参数,添加一个classid
然后选中数据表格组件,设置数据筛选条件
设置查询条件为班级等于我们的URL参数
回到班级列表页面,给口令按钮设置点击事件
选择打开页面
选择我们的班级口令列表,classid传入表格行的数据标识
3 生成口令
口令的话我们是准备生成六位的随机数,这个需要编写API来实现。API是我们低代码的后端,可以按照云开发的语法进行编制。
我们生成口令的方案是,先随机生成一个六位的数字,然后给班级口令表写入一条数据,在写入时需要传入班级标识
点击侧边栏的API,点击+号创建API
选择自定义代码
填写方法的名称和标识
修改方法的名称和标识
点击添加入参,输入classid
在编辑器中输入如下代码:
function createPassword(){
const length = 6
const characters = '0123456789';
let password = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
password += characters[randomIndex];
}
return password;
}
module.exports = async function (params, context) {
const classid = params.classid
const password = createPassword()
const result = await context.callModel({
name: 'bjklb', // 数据模型标识,可以前往「数据源 - 数据模型」列表页查看
methodName: 'wedaCreateV2', // 数据模型方法标识,支持的方法可以前往「数据源 - 数据模型」的任一数据模型详情页查看当前模型支持的方法
params: {
data:{
bj:{_id:classid},
bjkl:password,
klzt:"1"
}
}, // 数据模型方法的入参
});
// 这里返回数据,和出参结构映射
return {password,result};
};
这里我们解读一下这个代码,module.exports这个是模块的导出语法,等号右边就是我们导出的函数,有两个入参,分别是params和context
module.exports = async function (params, context) {
params对应着我们在上边通过界面添加的入参,这里我们只有一个入参是班级标识
context相当于是API的上下文环境,这里可以通过调用callModel方法给数据源写入一条数据
const classid = params.classid
这个地方我们定义了一个常量,用赋值语句将入参的classid赋值给我们的常量
const password = createPassword()
这个我们定义了一个常量用来接收我们随机生成的六位口令
function createPassword(){
const length = 6
const characters = '0123456789';
let password = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
password += characters[randomIndex];
}
return password;
}
这里我们调用了工具类Math的随机数方法random,这样帮我们生成一个随机的六位数字
const result = await context.callModel({
name: 'bjklb', // 数据模型标识,可以前往「数据源 - 数据模型」列表页查看
methodName: 'wedaCreateV2', // 数据模型方法标识,支持的方法可以前往「数据源 - 数据模型」的任一数据模型详情页查看当前模型支持的方法
params: {
data:{
bj:{_id:classid},
bjkl:password,
klzt:"1"
}
}, // 数据模型方法的入参
});
这里是调用了微搭的后端API,调用了数据源的创建单条方法,里边有几个参数要传递,name是我们的数据源的标识,切换到云数据库,找到对应的标识进行粘贴
methodName相当于调用哪个方法,这里我们调用的是单条写入,方法名称可以从官方文档里找
https://cloud.tencent.com/document/product/1301/96166#.E6.96.B0.E5.A2.9E.EF.BC.88wedacreatev2.EF.BC.89
params里的data就是我们需要写入的数据,左边的键是对应数据源的字段,右边的值根据实际情况传入
在传入值的时候要结合字段的类型,比如我们的班级字段,本身是一个对象类型,里边的键是_id表示要传入数据标识
代码写好了之后就需要测试,点击右侧的方法测试,传入入参,入参可以从云数据库粘贴数据的数据标识字段
运行测试之后我们可以看到返回的结果,点击出参映射就完成了API的编写
4 调用API
API编写好之后需要界面上调用,回到我们的班级口令列表页面,点击新建按钮,将原来的方法改为调用数据源方法
点击fx传入我们的URL参数
写入成功后跟一个表格刷新的事件
点击一下生成口令,我们的口令就自动写入到表里了
总结
我们本篇介绍了一下口令生成的方案,互联网应用上线之后尤其要考虑数据安全的问题,我们通常都是通过这种加一层验证机制去解决。