You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
//定义相关 OAuth event
class UserGithubOAuthEvent{
final String loginName;
final String token;
final bool isSuccess;
UserGithubOAuthEvent(this.loginName,this.token,this.isSuccess);
}
前言
关于 FlutterGo 或许不用太多介绍了。
如果有第一次听说的小伙伴,可以移步FlutterGo官网查看下简单介绍.
FlutterGo 在这次迭代中有了不少的更新,笔者在此次的更新中,负责开发后端以及对应的客户端部分。这里简单介绍下关于 FlutterGo 后端代码中几个功能模块的实现。
总体来说,FlutterGo 后端并不复杂。此文中大概介绍以下几点功能(接口)的实现:
环境信息
阿里云 ECS 云服务器
Linux iz2ze3gw3ipdpbha0mstybz 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
mysql :
mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
node:
v12.5.0
开发语言:
midway
+typescript
+mysql
代码结构:
登陆功能
首先在
class/user.ts
中定义一个user
表结构,大概需要的字段以及在interface.ts
中声明相关接口。这里是midway
和ts
的基础配置,就不展开介绍了。FlutterGo 提供了两种登陆方式:
GitHubOAuth
认证因为是手机客户端的
GitHubOauth
认证,所以这里其实是有一些坑的,后面再说。这里我们先从简单的开始说起用户名/密码登陆
因为我们使用 github 的用户名/密码登陆方式,所以这里需要罗列下 github 的 api:developer.github.com/v3/auth/,
文档中的核心部分:
curl -u username https://api.github.com/user
(大家可以自行在 terminal 上测试),回车输入密码即可。所以这里我们完全可以在拿到用户输入的用户名和密码后进行 githu 的认证。关于 midway 的基本用法,这里也不再赘述了。整个过程还是非常简单清晰的,如下图:
相关代码实现(相关信息已脱敏:xxx):
service
部分controller
GitHubOAuth 认证
这里有坑!我回头介绍
githubOAuth 认证就是我们常说的 github app 了,这里我直接了当的丢文档:creating-a-github-app
笔者还是觉得文档类的无需介绍
当然,我这里肯定都建好了,然后把一些基本信息都写到 server 端的配置中
还是按照上面的套路,咱们先介绍流程。然后在说坑在哪。
客户端部分
客户端部分的代码就相当简单了,新开 webView ,直接跳转到
github.com/login/oauth/authorize
带上client_id
即可。server 端
整体流程如上,部分代码展示:
service
controller
代码逻辑就是调用 service 中的数据来走上面流程图中的信息。OAuth 中的坑
其实,github app 的认证方式非常适用于浏览器环境下,但是在 flutter 中,由于我们是新开启的 webView 来请求的 github 登陆地址。当我们后端成功返回的时候,无法通知到 Flutter 层。就导致我自己的 Flutter 中 dart 写的代码,无法拿到接口的返回。
中间脑暴了很多解决办法,最终在查阅 flutter_webview_plugin 的 API 里面找了个好的方法:
onUrlChanged
简而言之就是,Flutter 客户端部分新开一个 webView去请求
github.com/login
,github.com/login
检查client_id
后会带着code 等乱七八糟的东西来到后端,后端校验成功后,redirect Flutter 新开的 webView,然后flutter_webview_plugin
去监听页面 url 的变化。发送相关 event ,让Flutter 去 destroy 当前 webVIew,处理剩余逻辑。Flutter 部分代码
webView page
:login page
:组件树获取
表结构
在聊接口实现的之前,我们先了解下,关于组件,我们的表机构设计大概是什么样子的。
FlutterGO 下面 widget tab很多分类,分类点进去还是分类,再点击去是组件,组件点进去是详情页。
上图模块点进去就是组件 widget
上图是 widget,点进去是详情页
所以这里我们需要两张表来记录他们的关系:cat(category)和 widget 表。
cat 表中我们每行数据会有一个
parent_id
字段,所以表内存在父子关系,而widget
表中的每一行数据的parent_id
字段的值必然是cat
表中的最后一层。比如Checkbox
widget
的parent_id
的值就是cat
表中Button
的 id。需求实现
在登陆的时候,我们希望能获取所有的组件树,需求方要求结构如下:
因为现在存在三方共建组件,而且我们详情页也较FlutterGo 1.0 版本有了很大改动,如今组件的详情页只有一个,内容全部靠 md 渲染,在 md 中写组件的 demo 实现。所以为了兼容旧版本的 widget,我们有
display
来区分,新旧widget
分别通过pageId
和router
来跳转页面。目前实现实际返回为:
代码实现
其实这个接口也是非常简单的,就是个双循环遍历嘛,准确的说,有点类似深度优先遍历。直接看代码吧
获取所有 parentId 相同的 category (后面简称为 cat)
首字母转小写
我们只要自己外部维护一个组件树,然后
cat
表中的读取到的每一个parent_id
都是一个节点。当前id
没有别的cat
对应的parent_id
就说明它的下一级是“叶子”widget
了,所以就从widget
中查询即可。easy~彩蛋
FlutterGo 中有一个组件搜索功能,因为我们存储
widget
的时候,并没有强制带上该widget
的路由,这样也不合理(针对于旧组件),所以在widget
表中搜索出来,还要像上述过程那样逆向搜索获取“旧”widget
的router
字段我的个人代码实现大致如下:
收藏功能
收藏功能,必然是跟用户挂钩的。然后收藏的组件该如何跟用户挂钩呢?组件跟用户是
多对多
的关系。这里我新建一个
collection
表来用作所有收藏过的组件。为什么不直接使用widget
表呢,因为我个人不希望表太过于复杂,无用的字段太多,且功能不单一。由于是收藏的组件和用户是多对多的关系,所以这里我们需要一个中间表
user_collection
来维护他两的关系,三者关系如下:功能实现思路
校验收藏
collection
表中检查用户传入的组件信息,没有则为收藏、有则取出其在collection
表中的 idsession
中获取用户的 idcollection_id
和user_id
来检索user_collection
表中是否有这个字段添加收藏
findOrCrate
的检索collection
表,并且返回一个collection_id
user_id
和collection_id
存入到user_collection
表中(互不信任原则,校验下存在性)移除收藏
collection
表中的collection_id
user_collection
对应字段即可获取全部收藏
collection
表中所有user_id
为当前用户的所有collection_id
collection_id
s 来获取收藏的组件列表部分代码实现
整体来说,思路还是非常清晰的。所以这里我们仅仅拿收藏和校验来展示下部分代码:
service
层代码实现controller
层代码实现因为常要获取
collection
表中的collection_id
字段,所以这里抽离出来作为公共方法feedback 功能
feedback 功能就是直接可以在 FlutterGo 的个人设置中,发送 issue 到 Alibaba/flutter-go 下。这里主要也是调用 github 的提 issue 接口 api issues API。
后端的代码实现非常简单,就是拿到数据,调用 github 的 api 即可
service
层controller
层彩蛋
猜测可能会有人 FlutterGo 里面这个 feedback 是用的哪一个组件~这里介绍下
pubspec.yaml
因为在开发的时候,flutter 更新了,导致zefyr 运行报错。当时也是提了 issue:chould not Launch FIle (写这篇文章的时候才看到回复)
但是当时由于功能开发要发布,等了好久没有
zefyr
作者的回复。就在本地修复了这个 bug,然后包就直接引入本地的包了。共建计划
咳咳,敲黑板啦~~
Flutter 依旧在不断地更新,但仅凭我们几个 Flutter 爱好者在工作之余维护 FlutterGo 还是非常吃力的。所以这里,诚邀业界所有 Flutter 爱好者一起参与共建 FlutterGo!
此处再次感谢所有已经提交 pr 的小伙伴
![](https://camo.githubusercontent.com/61b2facaa8c21265e0c36621438d9fcc1303ed0095085918f271a2ca5a3f5564/68747470733a2f2f696d672e616c6963646e2e636f6d2f7466732f5442315033326a66455931674b306a535a464358586377715858612d3937342d3331372e706e67)
共建说明
由于 Flutter 版本迭代速度较快,产生的内容较多, 而我们人力有限无法更加全面快速的支持Flutter Go的日常维护迭代, 如果您对flutter go的共建感兴趣, 欢迎您来参与本项目的共建.
凡是参与共建的成员. 我们会将您的头像与github个人地址收纳进我们的官方网站中.
共建方式
本次更新, 开放了 Widget 内容收录 的功能, 您需要通过 goCli 工具, 创建标准化组件,编写markdown代码。
为了更好记录您的改动目的, 内容信息, 交流过程, 每一条PR都需要对应一条 Issue, 提交你发现的
BUG
或者想增加的新功能
, 或者想要增加新的共建组件,首先选择你的
issue
在类型,然后通过 Pull Request 的形式将文章内容, api描述, 组件使用方法等加入进我们的Widget界面。参与共建
关于如何提PR请先阅读以下文档
贡献指南
此项目遵循贡献者行为准则。参与此项目即表示您同意遵守其条款.
FlutterGo 期待你我共建~
学习交流
关注公众号: 【全栈前端精选】 每日获取好文推荐。还可以入群,一起学习交流呀~~
The text was updated successfully, but these errors were encountered: