文档地址: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实现身份验证
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
层的登录鉴权服务,根据参数返回用户的token
和ticket
。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/
转载请注明作者和地址。