前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云开发实践

云开发实践

原创
作者头像
滴水
修改2020-06-15 11:05:51
1.1K0
修改2020-06-15 11:05:51
举报
文章被收录于专栏:云开发实践云开发实践
文档地址: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 = '角色表';

建表

官方文档

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

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

云函数(接口开发)

官方文档

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

新建发布云函数

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

调用方式

  • 使用腾讯提供的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;
};
  • 写个发布脚本,可以快速发布
login
login
  • 控制台看下函数列表,已经有了
login
login
  • 控制台直接提供了简单的测试工具,测试一下,ok的。
test
test
  • 配置下函数用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/

转载请注明作者和地址。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用原因
  • 目录
  • 数据库设计
    • 设计
    • 建表
    • 云函数(接口开发)
      • 新建发布云函数
        • 调用方式
          • 鉴权有很多种
          • 角色模块
      • 鉴权
      • 增删查改
        • 前端
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档