云开发实践

2020-06-15 11:05:51 浏览数 (1)

文档地址:https://ashuihui.github.io/tencent-book/

转载请注明作者和地址。

官方文档

云开发是腾讯云为移动开发者提供的高可用、自动弹性扩缩的后端云服务,包含计算、存储、CDN、静态托管等能力(Serverless 化),可用于开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等,后续会陆续支持 iOS 和 Android 等移动应用开发),达到一站式后台服务构建多端应用,帮助开发者统一构建和管理后端服务和后端云资源,避免了应用开发过程中参与繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。

使用原因

  • 套餐提供了云函数、云数据库、云存储资源,监控、报警。不用单独购买
  • 不用维护机器、环境、数据库
  • 有免费使用额度
  • 根据使用量计费

目录

  • 数据库设计
  • 云函数介绍
  • 鉴权
  • 增删查改
  • 个人权限系统前端

数据库设计

云开发套餐提供的是 NoSQL 数据库,底层是MongoDB。 如果你不了解,可以简单的阅读下wiki

设计

nosql是文档数据,扩展非常容易简单。但一个项目的地基就是数据库的数据设计,还是需要设计下er图。

这里我偷懒了,图上没字段,但是我写了sql建表文件。 腾讯云提供控制台手动建表,sql文件可以不写,写了有利于后续开发人员对数据库的维护和扩展。贴两个表:

代码语言:javascript复制
-- 用户表
CREATE TABLE `t_user`(
    `id` bigint(20) UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '主键,自增id',
    `password` VARCHAR(100) NOT NULL COMMENT '密码',
    `name` VARCHAR(50) NOT NULL COMMENT '用户名称',
    `real_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '真实姓名',
    `phone` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '手机号',
    `email` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '邮箱',
    `remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注',
    `yn` tinyint(2) NOT NULL DEFAULT 1 COMMENT '有效位 1:有效 0:无效',
    `creator` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '创建者',
    `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `modifier` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '修改人',
    `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `uniq_01` (`phone`, `yn`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '用户表';

-- 角色表
CREATE TABLE `t_role`(
    `id` bigint(20) UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '主键id',
    `system_id` bigint(20) UNSIGNED NOT NULL COMMENT '系统id',
    `name` VARCHAR(50) NOT NULL COMMENT '角色名称',
    `remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注',
    `yn` tinyint(2) NOT NULL DEFAULT 1 COMMENT '有效位 1:有效 0:无效',
    `creator` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '创建者',
    `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `modifier` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '修改人',
    `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `uniq_01` (`system_id`, `name`, `yn`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '角色表';

建表

官方文档

官方文档写的很清楚了,我简单写下流程

  • 首先进入云开发的控制台
  • 左边菜单栏选择数据库
  • 点击蓝色按钮"添加集合"
  • 模态框输入集合名字确认
  • 刷新后表里有该集合名
  • 点击集合名进入集合管理,可以管理文档和索引 截个小图。

云函数(接口开发)

官方文档

云函数就是函数,托管给云平台,使用云平台计算资源去执行。

新建发布云函数

  • 可以用node、python、php开发
  • 本文采用的是node
  • 可以在云平台提供的控制台里新建函数,也可以通过官方提供的脚手架新建发布函数
  • 来个Hello World!,就是这么简单

调用方式

  • 使用腾讯提供的stk 在客户端直接调用云函数,这样的触发方式安全性较高
  • 使用http触发,和传统接口无二别,但是这种触发方式鉴权需自己把控,避免流量攻击。每次调用都是白花花的银子。
  • 也可以设置定时器,定时触发
  • 具体看官方文档

鉴权

官方文档

用户身份鉴权(/验证)后,才有权去调用我们的接口(/云函数),才能获取到数据库里的数据;也便于用户访问记录的收集和分析。

鉴权有很多种

  • 微信授权登录
  • 匿名登录
  • 微信小程序登录
  • 自定义登录实现鉴权 企业一般是微信授权登录,绑定自家用户系统。 个人嘛,选择自定义登录授权。微信授权和小程序授权有太多手续;匿名太不安全,也费流量钱。
  • 写个登录云函数,用rsa加密,token pwt实现身份验证
代码语言:javascript复制
import { getToken, IParams } from './services/login';
import baseModel from './models/index';
module.exports.main = async (event, context) => {
    if (!event || !event.queryStringParameters) {
        return baseModel.errorParams;
    }
    let params = {
        phone: event.queryStringParameters.phone || '',
        password: event.queryStringParameters.password || '',
    };
    console.log('params=>', params);
    if (!params.phone || !params.password) {
        return baseModel.errorParams;
    }
    let result = null;
    await getToken(params as IParams)
        .then((res) => {
            result = res;
        })
        .catch((err) => {
            result = err;
        });
    return result;
};
  • 写个发布脚本,可以快速发布
  • 控制台看下函数列表,已经有了
  • 控制台直接提供了简单的测试工具,测试一下,ok的。
  • 配置下函数用http触发,设置下路由
  • 前端可以通过sdk调用、也可以用http。
数据返回的细节
  • 返回数据设计如下:{ code:number data:object msg:string } code:标识符,成功、失败、失败类型 data:具体业务的返回数据 msg:字符串消息,eg:失败原因
  • 可以看到我写了个baseModel,放了最基本的返回,像参数错误、数据库错误、成功/失败封装方法等等,偷懒复用。
  • getToken方法就是service层的登录鉴权服务,根据参数返回用户的tokenticket
  • ticket生成参考官方文档
  • token生成直接用jsonwebtoken

增删查改

后台系统,最多的页面就是各种表格、表单,最多的接口就是增删查改。 云函数QPS 200次/s,一个接口并发限制200。 个人系统用不了太多,所以我又偷懒了, 直接一个模块的增删查改放一个路由里,调同一个函数。

角色模块

代码语言:javascript复制
import baseModel from './models/index';
import roleModel from './models/role';
import dao from './dao/index';
import { EBaseAction } from './interfaces/index';
module.exports.main = async (event, context) => {
    if (!event || !event.queryStringParameters) {
        return baseModel.errorParams;
    }
    let action: EBaseAction = event.queryStringParameters.action || null;
    let params = roleModel.orm(event.queryStringParameters.params);
    let options = dao.baseOptions(event.queryStringParameters.options || {});
    console.log('action=>', action);
    console.log('params=>', params);
    console.log('options=>', options);
    if (!params.systemId || !action) {
        return baseModel.errorParams;
    }
    let result: any = baseModel.error();

    switch (action) {
        case EBaseAction.add:
            result = await dao.add('t_role', params);
            break
        case EBaseAction.delete:
            result = await dao.delete('t_role', params);
            break;
        case EBaseAction.update:
            result = await dao.update('t_role', params);
            break;
        case EBaseAction.select:
            let total: any = await dao.count(
                't_role',
                roleModel.selctOrm(event.queryStringParameters.params)
            );
            result = await dao.select(
                't_role',
                roleModel.selctOrm(event.queryStringParameters.params),
                { ...options, total }
            );
            break;
        default:
            result = baseModel.error({ msg: 'action error' });
    }

    return result;
};
  • dao层放的数据库操作
  • todo:
    • 入参统一格式化
    • 装饰器;count获取优化

前端

  • 首先全局安装我的个人前端脚手架:npm install -g frontend-cli-shui

这个脚手架我刚开始建设,现在还只有单页面的模板,npm已经发布,欢迎使用。 然后用这个脚手架根据配置快速起一个react项目模版:fe-cli init frontend-power

  • 然后用ant design 组件简单写个登录页、表格页、表单页
文档地址:https://ashuihui.github.io/tencent-book/

转载请注明作者和地址。

0 人点赞