mochat-cloud / mochat Goto Github PK
View Code? Open in Web Editor NEW基于企业微信的开源SCRM应用开发框架&引擎,也是一套通用的企业私域流量管理系统!
Home Page: https://mo.chat
License: GNU General Public License v3.0
基于企业微信的开源SCRM应用开发框架&引擎,也是一套通用的企业私域流量管理系统!
Home Page: https://mo.chat
License: GNU General Public License v3.0
修改文件 :vendor/hyperf/database/src/Schema/Grammars/MySqlGrammar.php
找到 compileColumnListing
方法,修改如下:
/**
* Compile the query to determine the list of columns.
*/
public function compileColumnListing(): string
{
return 'select `column_key` as `column_key`, `column_name` as `column_name`, `data_type` as `data_type`, `column_comment` as `column_comment`, `extra` as `extra`, `column_type` as `column_type` from information_schema.columns where `table_schema` = ? and `table_name` = ? order by ORDINAL_POSITION';
}
service层通过构造函数new的方式创建service中的model对象,service注解到logic或controller,这种写法,service中model在协程上下文切换时,如果有别的协程也在调用这个注解的service,model的属性可能被修改,存在协程不安全
RT: 请教自动拉群是用的企业微信什么接口实现的?
部门结构 A 部门下 有 A1 和 A2 2个部门, 选择A 时出现5个人, 选择A1时出现 1个人, 选择A2时 没有人出现
composer install找不到库
operation 前端 执行 yarn install 出错
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp verb command build []
gyp verb build type Release
gyp verb architecture x64
gyp verb node dev dir /root/.node-gyp/16.15.0
gyp verb which
succeeded for make
/usr/bin/make
gyp info spawn make
gyp info spawn args [ 'V=1', 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory /www/wwwroot/mochat/operation/node_modules/node-sass/build' g++ '-DNODE_GYP_MODULE_NAME=libsass' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DLIBSASS_VERSION="3.5.5"' -I/root/.node-gyp/16.15.0/include/node -I/root/.node-gyp/16.15.0/src -I/root/.node-gyp/16.15.0/deps/openssl/config -I/root/.node-gyp/16.15.0/deps/openssl/openssl/include -I/root/.node-gyp/16.15.0/deps/uv/include -I/root/.node-gyp/16.15.0/deps/zlib -I/root/.node-gyp/16.15.0/deps/v8/include -I../src/libsass/include -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -fno-omit-frame-pointer -std=gnu++14 -std=c++0x -fexceptions -frtti -MMD -MF ./Release/.deps/Release/obj.target/libsass/src/libsass/src/ast.o.d.raw -c -o Release/obj.target/libsass/src/libsass/src/ast.o ../src/libsass/src/ast.cpp g++: error: unrecognized command line option ‘-std=gnu++14’ make: *** [Release/obj.target/libsass/src/libsass/src/ast.o] Error 1 make: Leaving directory
/www/wwwroot/mochat/operation/node_modules/node-sass/build'
gyp ERR! build error
gyp ERR! stack Error: make
failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/www/wwwroot/mochat/operation/node_modules/node-gyp/lib/build.js:262:23)
gyp ERR! stack at ChildProcess.emit (node:events:527:28)
gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
gyp ERR! System Linux 3.10.0-1160.53.1.el7.x86_64
gyp ERR! command "/www/server/nvm/versions/node/v16.15.0/bin/node" "/www/wwwroot/mochat/operation/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /www/wwwroot/mochat/operation/node_modules/node-sass
gyp ERR! node -v v16.15.0
您好,在测试的时候有个问题,就是会经常报超时错误,刷新页面也不行,但是过几分钟就正常了,想问下是配置的nginx有问题?还是后台不稳定造成的
账号管理,195号段不能添加
docker版本
我添加完了企业,并配置好企业的信息,使用消息存档功能没有任何消息,我查看源代码后发现MessageSyncDataTask的注释上写着TODO 本功能暂未启用。消息存档这个功能现在是咱不可用么?
安装配置dashboard时,执行yarn run build后,一直提示缺少必要的文件,提示信息如下:
ERROR Error: Cannot find module './public/dll/antDesignVue-manifest.json'
尝试过node16/15/14/13/10等多个版本,均如此
访问 http://mochat.test/workEmployee/index?page=1&perPage=10 显示 500错误
报错信息如下:
// api-server\app\Service\WorkEmployeeStatisticService.php
/**
* 查询多条 - 根据成员ID.
*/
public function getEmployeeStatisticIdsByEmployeeIds(array $employeeIds, array $columns = ['*'], array $options = []): array
{
$model = $this->model::query()
->select('id', Db::raw('MAX(id) as id'))
->whereIn('employee_id', $employeeIds);
if (! empty($options['groupBy'])) {
$model = $model->groupBy($options['groupBy']);
}
return $model->get()->toArray();
}
// api-server\app\Logic\WorkEmployee\IndexLogic.php
/**
* 成员统计
*/
protected function getEmployeeStatistics(array $employeeIds): array
{
$employeeStatisticsIds = $this->workEmployeeStatisticService->getEmployeeStatisticIdsByEmployeeIds($employeeIds, ['id', 'employee_id'], ['groupBy' => ['employee_id']]);
}
id 不在 group by 的字段中,查询为报错。MySQL 版本为5.7.26.
{"@timestamp":"2021-08-24T14:09:32.295530+08:00","@Version":1,"host":"442901984fb7","message":"SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mochat_v1.mc_room_clock_in_contact.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select id
, nickname
, avatar
, total_day
, series_day
from mc_room_clock_in_contact
where clock_in_id
= 1 and total_day
> 0 and mc_room_clock_in_contact
.deleted_at
is null group by union_id
, total_day
order by total_day
desc limit 10)[1082] in /opt/www/vendor/hyperf/database/src/Connection.php","type":"mochat","channel":"sys","level":"ERROR","monolog_level":400}
首次搭建成功之后,客户标签正常同步到页面,客户列表没有数据,数据库中也没有数据。
dashboard 编译失败, 看起来是去 require 不存在的 json文件,./public/ 下边没有 dll 文件夹,自然也不会有 dll/antDesignVue-manifest.json, 看起了也不像是 vue 或 webpack 会自动去创建文件夹和下载对应文件。
# 报错代码位置:
...
const dll = ['antDesignVue', 'vueCropper', 'echarts', 'corejs', 'vueContainerQuery']
dll.map(item => {
const path = `./public/dll/${item}-manifest.json`
config.plugins.push(new webpack.DllReferencePlugin({
manifest: require(path)
}))
})
...
# 报错命令:
$ yarn run build
yarn run v1.22.10
$ vue-cli-service build
✔ Building for production...
ERROR Error: Cannot find module './public/dll/antDesignVue-manifest.json'
Require stack:
- /home/thomas/scp_root/mochat/dashboard/vue.config.js
- /home/thomas/scp_root/mochat/dashboard/package.json
Error: Cannot find module './public/dll/antDesignVue-manifest.json'
Require stack:
- /home/thomas/scp_root/mochat/dashboard/vue.config.js
- /home/thomas/scp_root/mochat/dashboard/package.json
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
at Function.Module._load (internal/modules/cjs/loader.js:667:27)
at Module.require (internal/modules/cjs/loader.js:887:19)
at require (internal/modules/cjs/helpers.js:74:18)
at /home/thomas/scp_root/mochat/dashboard/vue.config.js:65:21
at Array.map (<anonymous>)
at configureWebpack (/home/thomas/scp_root/mochat/dashboard/vue.config.js:62:11)
at /home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/Service.js:251:21
at Array.forEach (<anonymous>)
at Service.resolveWebpackConfig (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/Service.js:248:30)
at PluginAPI.resolveWebpackConfig (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/PluginAPI.js:132:25)
at module.exports (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/commands/build/resolveAppConfig.js:46:14)
at build (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/commands/build/index.js:147:50)
at /home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/commands/build/index.js:89:13
at Service.run (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/lib/Service.js:230:12)
at Object.<anonymous> (/home/thomas/scp_root/mochat/dashboard/node_modules/@vue/cli-service/bin/vue-cli-service.js:36:9)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
php.ini 需要给多少内存?一直提示内存不足
服务部署好了,前端页面也弄好了,我在我本地电脑上任何浏览器访问是正常的,但是除了这台电脑以外,其他的电脑,包括手机,用浏览器访问就会报跨域错误
Access to XMLHttpRequest at 'http://api.yowub.com/dashboard/user/auth. from origin 'http://dashboard.yowub.com/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
只有我自己的侧边栏编译后有两个Id=app吗?
General error: 1525 Incorrect TIMESTAMP value: ''2021-11-17'' (SQL: select count(id
) as aggregate from mc_shop_code_record
where corp_id
= 1 and type
= 1 and created_at
> '2021-11-17' and mc_shop_code_record
.deleted_at
is null)[1082] in /opt/www/vendor/hyperf/database/src/Connection.php","type":"mochat","channel":"sys","level":"ERROR","monolog_level":400}
企业微信外部群聊机器人有相关第三方应用或者有开发计划吗?
群管理支持对发广告自动踢人吗?
dotnet core 版本的 mochat 在不在开发计划内呀?
部署完请求接口报 后台服务异常.hard
RT
http://www.sss.local/dashboard/officialAccount/index?type=2 后台服务异常.hard ,我看了下,其实访问报错也没有日志在runtime里面,然后调试特别不方便,改一个代码要重启一下,
最好我排查了下,mysql 里面 没有 official_account 这个表
Nginx 有没有参考的配置文件
这个问题历史问题中也都有问过,但是都没给满意的答复,就关闭了,我觉得这种行为是很草率的。这里我给大家彻底的解释一下,为什么会报 未认证,没有token
这个问题。
导致的原因:报这个问题的人大多数是未使用初始化脚本去配置,而是自己直接去改配置文件 .env
。
追问:那为什么没用过初始化脚本,就会报这个问题呢?
1、未通过初始化脚本初始配置项,系统没办法生成一条默认账号。这时候,我们通过简单的代码调试,就知道 mc_user
表缺数据,就会去添加数据。
2、面临的第二个问题就是,密码是加密后的,这是我们追源码,也很容易知道密码是
password_hash(md5($signatureString . $this->getSecret()), PASSWORD_BCRYPT);
这么来的。这也是官方,给的原因,说你密码错了,这个那个的。
3、你发现你的密码是对的,为什么还是报呢?继续追代码你会发现,token
其实是生成了,只是调用 /role/permissionByUser
报莫名其妙的错误 未认证,没有token
。这个错误极具误导性,让人以为是header中未携带token,其实好好的携带着呢。
追/role/permissionByUser
发现并没有进入这个方法,之前就被拦住了,报错了。那就是中间件的问题了。最终找到
mochat/api-server/app/Model/Traits/UserTrait.php
的 72 - 73行。有如下代码:
$redis = $container->get(Redis::class); $cacheData = $redis->get('mc:user.' . $id);
jwt这个组件,需要用到redis 去存储用户的信息,未连上报的错误。我想大多数的人,都是因为,并没有去连接redis也能启动,而忽略了。
mc:init 执行不成功时如何处理
添加企业微信,总是超时,后台Debug信息也没看到什么错误。但就是不能添加成功。请问是什么原因呀?
执行如下指令时报错:php bin/hyperf.php mc:init
刚开始初始化时正常,当配置到管理员手机并回车确定时,看到提示输入管理员密码,接着就是报错信息了。
输入redis.db [0]:
>
+------------+-----------+
| 属性名称 | 属性值 |
+------------+-----------+
| REDIS_HOST | 127.0.0.1 |
| REDIS_PORT | 6379 |
| REDIS_AUTH | |
| REDIS_DB | 0 |
+------------+-----------+
重载配置成功
输入管理员的手机号:
> 18888888888
输入管理员密码:
> PHP Fatal error: Uncaught Symfony\Component\Console\Exception\RuntimeException: Unable to hide the response. in /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php:434
完整报错信息如下:
> PHP Fatal error: Uncaught Symfony\Component\Console\Exception\RuntimeException: Unable to hide the response. in /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php:434
Stack trace:
#0 /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php(120): Symfony\Component\Console\Helper\QuestionHelper->getHiddenResponse()
#1 /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php(67): Symfony\Component\Console\Helper\QuestionHelper->doAsk()
#2 /www/wwwroot/mochat/api-server/vendor/symfony/console/Style/SymfonyStyle.php(361): Symfony\Component\Console\Helper\QuestionHelper->ask()
#3 /www/wwwroot/mochat/api-server/vendor/hyperf/command/src/Command.php(182): Symfony\Component\Console\Style\SymfonyStyle->askQuestion()
#4 /www/wwwroot/mochat/api-server/runtime/container/proxy/MoChat_App_Install_Command_McInitCommand.proxy.php(203): Hyperf\Command\Command->secret()
#5 /www/wwwroot/mochat/api-server/runtime/container/proxy/MoChat_App_Install_Command_McInitCommand.pro in /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php on line 434
Fatal error: Uncaught Symfony\Component\Console\Exception\RuntimeException: Unable to hide the response. in /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php:434
Stack trace:
#0 /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php(120): Symfony\Component\Console\Helper\QuestionHelper->getHiddenResponse()
#1 /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php(67): Symfony\Component\Console\Helper\QuestionHelper->doAsk()
#2 /www/wwwroot/mochat/api-server/vendor/symfony/console/Style/SymfonyStyle.php(361): Symfony\Component\Console\Helper\QuestionHelper->ask()
#3 /www/wwwroot/mochat/api-server/vendor/hyperf/command/src/Command.php(182): Symfony\Component\Console\Style\SymfonyStyle->askQuestion()
#4 /www/wwwroot/mochat/api-server/runtime/container/proxy/MoChat_App_Install_Command_McInitCommand.proxy.php(203): Hyperf\Command\Command->secret()
#5 /www/wwwroot/mochat/api-server/runtime/container/proxy/MoChat_App_Install_Command_McInitCommand.pro in /www/wwwroot/mochat/api-server/vendor/symfony/console/Helper/QuestionHelper.php on line 434
问题:使用docker-compose方式安装mochat时,在执行docker-composer up后 一直报redis连接失败的错误
mochat_init | sh: /tmp/wait-for: not found
backend | [ERROR] RedisException:Connection refused(0) in /opt/www/vendor/hyperf/redis/src/RedisConnection.php:246
分析:主要是/docker-compose/services/mochat_init/wait-for这个sh文件没有被linux服务器识别 导致mochat_init初始化失败。
原因是shell脚本编写时的系统跟执行脚本的系统不一致,比如在window系统编写脚本,拷贝到Linux系统执行时就会遇见此问题。原因是在windows下编辑的.sh文件的格式为dos格式,而linux只能执行格式为unix格式的脚本。因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令。
另外就是在github上使用windows系统下载源文件中包含shell脚本文件时,解压并拷贝到Linux系统执行时,也可能发生此问题。
解决办法:
通过vi编辑器来查看文件的format格式
用vi命令打开文件vi wait-for
在vi命令模式中使用 :set ff 命令 可以看到文件的格式为
fileformat=dos
使用vi/vim修改文件format为unix
:set ff=unix
或者::set fileformat=unix
然后:wq保存退出,重新执行docker-composer up就正常了。
初始化时设置管理员密码如果用了符号,就无法修改了。
因为修改密码界面做了限制,只能是字母和数字
所以判断旧密码时无法通过验证
安装配置成功后,无法登录dashboard,提示未认证,没有token
INSERT INTO `mc_user` (`phone`,`password`,`status`,`isSuperAdmin`) VALUES ('13412347867','$2y$10$6PedNV6SVNQNpUMjZgauvewh7wfFjbSWbh2k9yGJ9dhAIBVcL4gKm',1,1);
INSERT INTO `mc_tenant` (`server_ips`) VALUES ('["182.92.11.11"]');
PHP Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mochat.user' doesn't exist in vendor/hyperf/database/src/Connection.php:282
建议在初始化安装提供表前缀填写
1、消息存档在下载时间比较短的音频文件转mp3的时候会失败,返回为空,不知道是我的ffmpeg问题还是什么,我转成了wav就没啥问题
2、消息存档如果有语音通话的记录,在程序获取同步的时候会因为没有对语音通话类型作处理(并未传回roomid)导致异步
[redis异步队列错误-message:] Undefined index: roomid
应该视频通话也会导致这个错误吧,望下个版本进行完善下
成员列表数据同步失败
执行composer install
Problem 1
- Root composer.json requires mochat/wework-finance-sdk ^1.0 -> satisfiable by mochat/wework-finance-sdk[v1.0.0].
- mochat/wework-finance-sdk v1.0.0 requires ext-wxwork_finance_sdk * -> it is missing from your system. Install or enable PHP's wxwork_finance_sdk extension.
执行项目初始化时,报错,
PHP Warning: Use of undefined constant SWOOLE_HOOK_ALL - assumed 'SWOOLE_HOOK_ALL' (this will throw an Error in a future version of PHP) in /www/wwwroot/mochat/api-server/bin/hyperf.php on line 12
Warning: Use of undefined constant SWOOLE_HOOK_ALL - assumed 'SWOOLE_HOOK_ALL' (this will throw an Error in a future version of PHP) in /www/wwwroot/mochat/api-server/bin/hyperf.php on line 12
PHP Warning: Use of undefined constant SWOOLE_HOOK_CURL - assumed 'SWOOLE_HOOK_CURL' (this will throw an Error in a future version of PHP) in /www/wwwroot/mochat/api-server/bin/hyperf.php on line 12
Warning: Use of undefined constant SWOOLE_HOOK_CURL - assumed 'SWOOLE_HOOK_CURL' (this will throw an Error in a future version of PHP) in /www/wwwroot/mochat/api-server/bin/hyperf.php on line 12
PHP Fatal error: Uncaught Error: Class 'Swoole\Coroutine' not found in /www/wwwroot/mochat/api-server/vendor/hyperf/engine/src/Coroutine.php:60
Stack trace:
#0 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Coroutine.php(90): Hyperf\Engine\Coroutine::id()
#1 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Context.php(41): Hyperf\Utils\Coroutine::inCoroutine()
#2 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Context.php(76): Hyperf\Utils\Context::has()
#3 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/DepthGuard.php(59): Hyperf\Utils\Context::override()
#4 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/DepthGuard.php(72): Hyperf\Di\Resolver\DepthGuard->increment()
#5 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call()
#6 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Container.php(184): Hyperf\Di\Resolver\ResolverDispatcher->resolve()
#7 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Containe in /www/wwwroot/mochat/api-server/vendor/hyperf/engine/src/Coroutine.php on line 60
Fatal error: Uncaught Error: Class 'Swoole\Coroutine' not found in /www/wwwroot/mochat/api-server/vendor/hyperf/engine/src/Coroutine.php:60
Stack trace:
#0 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Coroutine.php(90): Hyperf\Engine\Coroutine::id()
#1 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Context.php(41): Hyperf\Utils\Coroutine::inCoroutine()
#2 /www/wwwroot/mochat/api-server/vendor/hyperf/utils/src/Context.php(76): Hyperf\Utils\Context::has()
#3 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/DepthGuard.php(59): Hyperf\Utils\Context::override()
#4 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/DepthGuard.php(72): Hyperf\Di\Resolver\DepthGuard->increment()
#5 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call()
#6 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Container.php(184): Hyperf\Di\Resolver\ResolverDispatcher->resolve()
#7 /www/wwwroot/mochat/api-server/vendor/hyperf/di/src/Containe in /www/wwwroot/mochat/api-server/vendor/hyperf/engine/src/Coroutine.php on line 60
多次检查,api-server目录下并无vendor文件夾和子文件。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.