Home

Awesome

<div id="top"></div> <!-- PROJECT SHIELDS -->

Go Go Report Card Forks Stargazers MIT License Contributors Sourcegraph

<!-- PROJECT LOGO --> <div align="center"> <a href="https://github.com/rocboss/paopao-ce"> <img src="https://cdn.rocs.me/static/paopao-logo.png" alt="Logo" width="80" height="80"> </a> <h3 align="center">PaoPao</h3> <p align="center"> 🔥一个清新文艺的微社区 <br /> <a href="https://www.paopao.info/">View Demo</a> · <a href="https://github.com/rocboss/paopao-ce/pulls">Pull Request</a> · <a href="https://www.yuque.com/rocs/paopao/about">Features</a> </p> </div>

预览

Web端:
明色主题

暗色主题

更多演示请前往官网体验(谢绝灌水)

桌面端:

<p align="right">(<a href="#top">back to top</a>)</p>

🛠 技术栈

PaoPao主要由以下优秀的开源项目/工具构建

后端:

前端:

<!-- GETTING STARTED -->

🏗 快速开始

环境要求

以上环境版本为PaoPao官方的开发版本,仅供参考,其他版本的环境未进行充分测试

安装说明

方式一. 手动安装(推荐)

克隆代码库

git clone https://github.com/rocboss/paopao-ce.git

后端

  1. 导入项目根目录下的 scripts/paopao.sql 文件至MySQL数据库

  2. 拷贝项目根目录下 config.yaml.sample 文件至 config.yaml,按照注释完成配置编辑

  3. 编译后端
    编译api服务:

    make build
    

    编译api服务、内嵌web前端ui:

    make build
    

    也可以使用精简模式编译,不内嵌web前端ui:

    make build TAGS='slim embed'
    

    编译后在release目录可以找到对应可执行文件。

    release/paopao
    
  4. 直接运行后端
    运行api服务:

    make run
    

    运行api服务、web前端ui服务:

    make run TAGS='embed'
    

    提示: 如果需要内嵌web前端ui,请先构建web前端(建议设置web/.env为VITE_HOST="")。

  5. 使用内置的Migrate机制自动升级维护SQL DDL:

    # 添加 Migration 功能到 Features 中 开启migrate功能
    vim config.yaml
    # file: config.yaml
    # Features:
    #   Default: ["Base", "MySQL", "Zinc", "MinIO", "LoggerZinc", "Migration"]
    
    # 编译时加入migration tag编译出支持migrate功能的可执行文件
    make build TAGS='migration'
    release/paopao
    
    # 或者 带上migration tag直接运行
    make run TAGS='migration'
    

    注意:默认编译出来的可执行文件是不内置migrate功能,需要编译时带上migration tag才能内置支持migrage功能。

前端

  1. 进入前端目录 web,拷贝.env.env.local,编辑 .env.local 文件中后端服务地址及其他配置项,下载依赖包

    cd ./web && cp .env .env.local
    vim .env.local
    yarn
    
  2. 编译前端

    yarn build
    

    build完成后,可以在dist目录获取编译产出,配置nginx指向至该目录即可

桌面端

  1. 进入前端目录 web,拷贝.env.env.local,编辑 .env.local 文件中后端服务地址及其他配置项,下载依赖包

    cd ./web && cp .env .env.local
    vim .env.local
    yarn
    
  2. 编译前端

    yarn build
    
  3. 构建桌面端

    yarn tauri build
    

    桌面端是使用Rust + tauri编写 的,需要安装tauri的依赖,具体参考https://tauri.studio/v1/guides/getting-started/prerequisites.

方式二. 使用Docker构建、运行

# 默认参数构建, 默认内嵌web ui并设置api host为空
docker build -t your/paopao-ce:tag .

# 内嵌web ui并且自定义API host参数
docker build -t your/paopao-ce:tag --build-arg API_HOST=http://api.paopao.info .

# 内嵌web ui并且使用本地web/.env中的API host
docker build -t your/paopao-ce:tag --build-arg USE_API_HOST=no .

# 内嵌web ui并且使用本地编译的web/dist构建
docker build -t your/paopao-ce:tag --build-arg USE_DIST=yes .

# 只编译api server
docker build -t your/paopao-ce:tag --build-arg EMBED_UI=no .

# 运行
mkdir custom && docker run -d -p 8008:8008 -v ${PWD}/custom:/app/paopao-ce/custom -v ${PWD}/config.yaml.sample:/app/paopao-ce/config.yaml your/paopao-ce:tag

# 或者直接运行构建好的docker image
mkdir custom && docker run -d -p 8008:8008 -v ${PWD}/custom:/app/paopao-ce/custom -v ${PWD}/config.yaml.sample:/app/paopao-ce/config.yaml bitbus/paopao-ce:latest
cd web

# 默认参数构建
docker build -t your/paopao-ce:web .

# 自定义API host 参数构建
docker build -t your/paopao-ce:web --build-arg API_HOST=http://api.paopao.info .

# 使用本地编译的dist构建
docker build -t your/paopao-ce:web --build-arg USE_DIST=yes .

# 运行
docker run -d -p 8010:80 your/paopao-ce:web
# 构建Image
docker buildx build --build-arg USE_DIST="yes" -t your/paopao-ce:all-in-one-latest -f Dockerfile.allinone .

# 运行
docker run --name paopao-ce-allinone  -d -p 8000:8008 -p 7700:7700 -v ./data/custom:/app/custom -v ./data/meili_data:/app/meili_data your/paopao-ce:all-in-one-latest

# 或者使用官方Image运行
docker run --name paopao-ce-allinone  -d -p 8000:8008 -p 7700:7700 -v ./data/custom:/app/custom -v ./data/meili_data:/app/meili_data bitbus/paopao-ce:all-in-one-latest

# 或者使用官方Image运行 + 自定义config.yaml
docker run --name paopao-ce-allinone  -d -p 8000:8008 -p 7700:7700 -v ./config.yaml:/app/config.yaml -v ./data/custom:/app/custom -v ./data/meili_data:/app/meili_data bitbus/paopao-ce:all-in-one-latest

注意在config.yamlMeili.ApiKey的值必须与容器中meili启动时设定的MEILI_MASTER_KEY环境变量值相同,默认为paopao-meilisearch. 可以在docker启动容器时通过-e MEILI_MASTER_KEY=<custom-key>设置该值。

方式三. 使用 docker-compose 运行

git clone https://github.com/rocboss/paopao-ce.git
cd paopao-ce && docker compose up -d
# visit http://localhost:8008  👀 paopao-ce
# visit http://localhost:8001  👀 RedisInsight
# visit http://localhost:8080  👀 phpMyAdmin

默认是使用config.yaml.sample的配置,如果需要自定义配置,请拷贝默认配置文件(比如config.yaml),修改后再同步配置到docker-compose.yaml如下:

# file: docker-compose.yaml
...
  backend:
    image: bitbus/paopao-ce:latest
    restart: always
    depends_on:
      - db
      - redis
      - zinc
    # modify below to reflect your custom configure
    volumes:
      - ./config.yaml:/app/paopao-ce/config.yaml
    ports:
      - 8008:8008
    networks:
      - paopao-network
....

注意:默认提供的 docker-compose.yaml 初衷是搭建本机开发调试环境,如果需要产品部署供外网访问,请自行调优配置参数或使用其他方式部署。

开发文档

Docs文档说明

docs目录提供了各种开发文档,包括:

比如,关于paopao-ce的设计定位,可以参考docs/proposal/001-关于paopao-ce的设计定位,简要阐述了paopao-ce是如何定位自身的。

API文档

开发者可以在本地开启Docs服务,浏览后端导出的API服务接口文档。

...
Features:
  Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile", "Docs"]
  Docs: ["Docs:OpenAPI"]
...
make run TAGS='docs'

# visit http://127.0.0.1:8011/docs/openapi

配置说明

config.yaml.sample 是一份完整的配置文件模版,paopao-ce启动时会读取./custom/config.yaml./config.yaml任意一份配置文件(优先读取最先找到的文件)。

cp config.yaml.sample config.yaml
vim config.yaml # 修改参数
paopao serve

配置文件中的 Features 小节是声明paopao-ce运行时开启哪些功能项:

...

Features:
  Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile"]
  Develop: ["Base", "MySQL", "Option", "Sms", "AliOSS", "LoggerZinc"]
  Demo: ["Base", "MySQL", "Option", "Sms", "MinIO", "LoggerZinc"]
  Slim: ["Base", "Sqlite3", "LocalOSS", "LoggerFile"]
  Base: ["Zinc", "Redis", "Alipay",]
  Option: ["SimpleCacheIndex"]
  Sms: "SmsJuhe"

...

如上: Default/Develop/Demo/Slim 是不同 功能集套件(Features Suite), Base/Option 是子功能套件, Sms是关于短信验证码功能的参数选项。

这里 Default套件 代表的意思是: 使用Base/Option 中的功能,外加 MySQL/LocalOSS/LoggerFile功能,也就是说开启了Zinc/Redis/Alipay/SimpleCacheIndex/MySQL/LocalOSS/LoggerFile 7项功能; Develop套件依例类推。

使用Feautures:

release/paopao serve --help
Usage of release/paopao:
  -features value
        use special features
  -no-default-features
        whether use default features

# 默认使用 Default 功能套件
release/paopao serve

# 不包含 default 中的功能集,仅仅使用 develop 中声明的功能集
release/paopao serve --no-default-features --features develop 

# 使用 default 中的功能集,外加 sms 功能
release/paopao serve --features sms  

# 手动指定需要开启的功能集
release/paopao serve --no-default-features --features sqlite3,localoss,loggerfile,redis 

目前支持的功能集合:

功能项类别状态备注
Web子服务内测开启Web服务
Admin子服务WIP开启Admin后台运维服务
SpaceX子服务WIP开启SpaceX服务
Bot子服务WIP开启Bot服务
NativeOBS子服务WIP开启NativeOBS服务
Docs子服务WIP开启开发者文档服务
Frontend:Web子服务稳定开启独立前端服务
Frontend:EmbedWeb子服务稳定开启内嵌于后端Web API服务中的前端服务
Gorm数据库稳定(默认)使用gorm作为数据库的ORM,默认使用 Gorm + MySQL组合
Sqlx数据库WIP使用sqlx作为数据库的ORM
Sqlc数据库WIP使用sqlc自动生成ORM代码
MySQL数据库稳定(默认)使用MySQL作为数据库
Postgres数据库稳定使用PostgreSQL作为数据库
Sqlite3数据库稳定使用Sqlite3作为数据库
AliOSS对象存储稳定(推荐)阿里云对象存储服务
COS对象存储内测腾讯云对象存储服务
HuaweiOBS对象存储内测华为云对象存储服务
MinIO对象存储稳定MinIO对象存储服务
S3对象存储内测AWS S3兼容的对象存储服务
LocalOSS对象存储内测提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境
OSS:Retention对象存储内测基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能
OSS:TempDir对象存储内测基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能
Redis缓存稳定Redis缓存功能
SimpleCacheIndex缓存Deprecated提供简单的 广场推文列表 的缓存功能
BigCacheIndex缓存Deprecated使用BigCache缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面
RedisCacheIndex缓存Deprecated使用Redis缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面
Zinc搜索稳定(推荐)基于Zinc搜索引擎提供推文搜索服务
Meili搜索稳定(推荐)基于Meilisearch搜索引擎提供推文搜索服务
Bleve搜索WIP基于Bleve搜索引擎提供推文搜索服务
Sentry监控内测使用Sentry进行错误跟踪与性能监控
LoggerFile日志稳定使用文件写日志
LoggerZinc日志稳定(推荐)使用Zinc写日志
LoggerMeili日志内测使用Meilisearch写日志
LoggerOpenObserve日志内测使用OpenObserve写日志
Friendship关系模式内置 Builtin弱关系好友模式,类似微信朋友圈
Followship关系模式内置 Builtin关注者模式,类似Twitter的Follow模式
Lightship关系模式弃用 Deprecated开放模式,所有推文都公开可见
Alipay支付稳定开启基于支付宝开放平台的钱包功能
Sms短信验证稳定开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机
Docs:OpenAPI开发文档稳定开启openapi文档功能,提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi)
Pyroscope性能优化内测开启Pyroscope功能用于性能调试
Pprof性能优化内测开启Pprof功能收集Profile信息
PhoneBind其他稳定手机绑定功能
UseAuditHook其他内测使用审核hook功能
DisableJobManager其他内测禁止使用JobManager功能
Web:DisallowUserRegister功能特性稳定不允许用户注册

功能项状态详情参考 features-status.

搭建依赖环境

Zinc 搜索引擎:

# 创建用于存放zinc数据的目录
mkdir -p data/zinc/data

# 使用Docker运行zinc
docker run -d --name zinc --user root -v ${PWD}/data/zinc/data:/data -p 4080:4080 -e ZINC_FIRST_ADMIN_USER=admin -e ZINC_FIRST_ADMIN_PASSWORD=admin -e DATA_PATH=/data public.ecr.aws/zinclabs/zinc:latest

# 查看zinc运行状态
docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED        STATUS        PORTS                    NAMES
41465feea2ff   getmeili/meilisearch:v0.27.0         "tini -- /bin/sh -c …"   20 hours ago   Up 20 hours   0.0.0.0:7700->7700/tcp   paopao-ce-meili-1
7daf982ca062   public.ecr.aws/prabhat/zinc:latest   "/go/bin/zinc"           3 weeks ago    Up 6 days     0.0.0.0:4080->4080/tcp   zinc

# 使用docker compose运行
docker compose up -d zinc
# visit http://localhost:4080 打开自带的ui管理界面
# features中加上 Zinc 和 LoggerZinc
Features:
  Default: ["Zinc", "LoggerZinc", "Base", "Sqlite3", "BigCacheIndex","MinIO"]
...
LoggerZinc: # 使用Zinc写日志
  Host: 127.0.0.1:4080  # 这里的host就是paopao-ce能访问到的zinc主机
  Index: paopao-log
  User: admin
  Password: admin
  Secure: False         # 如果使用https访问zinc就设置为True
...
Zinc: # Zinc搜索配置
  Host: 127.0.0.1:4080
  Index: paopao-data
  User: admin
  Password: admin
  Secure: False

Meilisearch 搜索引擎:

mkdir -p data/meili/data

# 使用Docker运行
docker run -d --name meili -v ${PWD}/data/meili/data:/meili_data -p 7700:7700 -e MEILI_MASTER_KEY=paopao-meilisearch getmeili/meilisearch:v0.29.0
# visit http://localhost:7700 打开自带的搜索前端ui

# 使用docker compose运行,需要删除docker-compose.yaml中关于meili的注释
docker compose up -d meili

# 查看meili运行状态
docker compose ps
NAME                   COMMAND                  SERVICE             STATUS              PORTS
paopao-ce-meili-1      "tini -- /bin/sh -c …"   meili               running             0.0.0.0:7700->7700/tcp
# features中加上 Meili 和 LoggerMeili
Features:
  Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex","MinIO"]
...
LoggerMeili: # 使用Meili写日志
  Host: 127.0.0.1:7700
  Index: paopao-log
  ApiKey: paopao-meilisearch
  Secure: False
  MinWorker: 5               # 最小后台工作者, 设置范围[5, 100], 默认5
  MaxLogBuffer: 100          # 最大log缓存条数, 设置范围[10, 10000], 默认100
...
Meili: # Meili搜索配置
  Host: 127.0.0.1:7700      # 这里的host就是paopao-ce能访问到的meili主机
  Index: paopao-data
  ApiKey: paopao-meilisearch
  Secure: False             # 如果使用https访问meili就设置为True

MinIO 对象存储服务

mkdir -p data/minio/data

# 使用Docker运行
docker run -d --name minio -v ${PWD}/data/minio/data:/data -p 9000:9000 -p 9001:9001 -e MINIO_ROOT_USER=minio-root-user -e  MINIO_ROOT_PASSWORD=minio-root-password -e MINIO_DEFAULT_BUCKETS=paopao:public bitnami/minio:latest

# 使用docker compose运行, 需要删除docker-compose.yaml中关于minio的注释
docker compose up -d minio
# features中加上 MinIO
Features:
  Default: ["MinIO", "Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex"]
...
MinIO: # MinIO 存储配置
  AccessKey: Q3AM3UQ867SPQQA43P2F      # AccessKey/SecretKey 需要登入minio管理界面手动创建,管理界面地址: http://127.0.0.1:9001
  SecretKey: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  Secure: False
  Endpoint: 127.0.0.1:9000             # 根据部署的minio主机修改对应地址
  Bucket: paopao                       # 如上,需要在管理界面创建bucket并赋予外部可读写权限
  Domain: 127.0.0.1:9000               # minio外网访问的地址(如果想让外网访问,这里需要设置为外网可访问到的minio主机地址)
...

OpenObserve 日志收集、指标度量、轨迹跟踪

# 使用Docker运行
mkdir data && docker run -v $PWD/data:/data -e ZO_DATA_DIR="/data" -p 5080:5080 \
    -e ZO_ROOT_USER_EMAIL="root@paopao.info" -e ZO_ROOT_USER_PASSWORD="paopao-ce" \
    public.ecr.aws/zinclabs/openobserve:latest

# 使用docker compose运行, 需要删除docker-compose.yaml中关于openobserve的注释
docker compose up -d openobserve
# visit http://loclahost:5080
# features中加上 LoggerOpenObserve
Features:
  Default: ["Meili", "LoggerOpenObserve", "Base", "Sqlite3", "BigCacheIndex"]
...
LoggerOpenObserve: # 使用OpenObserve写日志
  Host: 127.0.0.1:5080
  Organization: paopao-ce
  Stream: default
  User: root@paopao.info
  Password: tiFEI8UeJWuYA7kN
  Secure: False
...

Pyroscope 性能剖析

mkdir -p data/minio/data

# 使用Docker运行
docker run -it -p 4040:4040 pyroscope/pyroscope:latest server
# 使用docker compose运行, 需要删除docker-compose.yaml中关于pyroscope的注释
docker compose up -d pyroscope
# visit http://loclahost:4040
# features中加上 Pyroscope
Features:
  Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "Pyroscope"]
...
Pyroscope: # Pyroscope配置
  AppName: "paopao-ce"
  Endpoint: "http://localhost:4040"   # Pyroscope server address
  AuthToken:                          # Pyroscope authentication token
  Logger:  none                       # Pyroscope logger (standard | logrus | none)
...

源代码分支管理

主代码库github.com/rocboss/paopao-ce

git branch
main
beta
dev
feature/bleve
feature/followship
feature/mir
feature/localoss
jc/alimy
r/paopao-plus
r/paopao-pro
x/sqlc
x/sqlx

分支说明

名称说明备注
main主分支分支main是主分支,也是paopao-ce的稳定版本发布分支,只有经过内部测试,没有重大bug出现的稳定代码才会推进到这个分支;该分支主要由beta分支代码演进而来,原则上只接受bug修复PRrc版本/稳定版本 发布都应该在main主分支中进行。
beta公测分支分支beta是公测分支,代码推进到main主分支的候选分支;该分支主要由alpha分支代码演进而来,接受bug修复以及新功能优化的PR,原则上不接受新功能PR。beta版本 发布都应该在beta公测分支下进行。
alpha内测分支分支alpha是内测分支,代码推进到beta分支的候选分支;该分支主要由dev分支代码演进而来,接受bug修复以及新功能相关的PR,接受新功能PR。分支代码演进到一个里程碑式的阶段后冻结所有新功能,合并代码到beta公测分支进行下一阶段的持续演进。alpha版本 发布都应该在alpha内测分支下进行。
dev开发分支分支dev是开发分支,不定期频繁更新,接受 新功能PR、代码优化PR、bug修复PR新功能PR 都应该首先提交给dev分支进行合并,bug修复/新功能开发/代码优化 阶段性冻结 后将代码演进合并到alpha分支。
feature/*子功能分支feature/*是新功能子分支,一般新功能子分支都是 dev开发分支fork出来的;子功能分支 只专注于该新功能 代码的开发/优化,待开发接近内测阶段 提交新功能PR给dev分支进行review/merge,待新功能代码演进到beta分支后,原则上是可以删除该分支,但也可以保留到稳定版本发布。该分支专注于新功能的开发,只接受新功能的bug修复/优化PR
jc/*维护者的开发分支jc/*是代码库维护者的开发分支,一般包含一些局部优化或者bug修复代码,有时可以直接将代码merge到dev/beta分支,原则上不允许直接merge代码到main主分支。
x/*实验分支x/*是技术实验分支,某些技术的引入需要经过具体的代码实现与真实场景的测评,考量评估后如果某项技术适合引入到paopao-ce,就fork出一个feature/*分支,作为新功能引入到paopao-ce。一般一些比较激进的技术,从dev分支fork出一个新的x/*分支,各种尝试、考量、评估后,或丢弃、或引入到paopao-ce。
t/*临时分支t/*是临时发版本分支,一般 beta 分支演进到正式版本发布前的最后某个beta版本(比如v0.2.0-beta)就从beta分支fork出一个 t/* 分支用于向 main 分支提交 PR 用于Review,待 PR Reviewed 合并到 main 分支后,可以删除这个临时创建的分支。这样设计主要是考虑到有时合并到 main 分支时,需要Review的时间可能会长一些,而dev分支的代码又急需推进到beta分支以发布下一个alpha版本用于内测,相当于为下一个测试版本发布腾地方。
r/*发行版本分支r/*是不同发行版本分支,不同发行版本各有不同的侧重点,可以根据需要选择适合的发行版本。

发行版本分支说明

名称说明维护者备注
paopao-cepaopao-ce 主发行版本ROC该分支 数据逻辑层 使用gorm作为数据逻辑层的ORM框架,适配MySQL/PostgreSQL/Sqlite3数据库。
r/paopao-cepaopao-ce 主分支预览版本ROC<br/>北野该分支 数据逻辑层 使用gorm作为数据逻辑层的ORM框架,适配MySQL/PostgreSQL/Sqlite3数据库。代码较main分支新,是主发行版本的前瞻预览版本。
r/paopao-ce-pluspaopao-ce-plus 发行版本北野该分支 数据逻辑层 使用sqlx作为数据逻辑层的ORM框架,专注于为MySQL/PostgreSQL/Sqlite3使用更优化的查询语句以提升数据检索效率。建议熟悉sqlx的开发人员可以基于此版本来做 二次开发。
r/paopao-ce-propaopao-ce-pro 发行版本北野该分支 数据逻辑层 使用sqlc作为sql语句生成器自动生成ORM代码,专门针对特定数据库MySQL/PostgreSQL进行查询优化,熟悉sqlc的开发人员可以基于此版本来做 二次开发。(另:分支目前只使用pgx-v5适配了PostgreSQL数据库,后续或许会适配MySQL/TiDB数据库。)
r/paopao-ce-xtrapaopao-ce-xtra 发行版本北野该分支 是r/paopao-ce、r/paopao-ce-plus、r/paopao-ce-pro的合集
r/paopao-ce-minipaopao-ce-mini 发行版本北野该分支是paopao-ce最小可用版本,专注于个人部署、一键傻瓜式最简部署

代码分支演进图

部署站点信息

具体部署站点信息请查阅 deployed-sites. 欢迎站长将已部署PaoPao实例的站点信息添加到 deployed-sites 列表中。

Collaborator's paopao account

昵称@GitHub@PaoPao
ROCROCROC
北野Michael Lialimy
orzi!orzi!

其他说明

建议后端服务使用 supervisor 守护进程,并通过 nginx 反向代理后,提供API给前端服务调用。

短信通道使用的聚合数据,如果申请不下来,可以考虑替换其他服务商。

代码结构比较简单,很方便扩展,开发文档请参阅docs.

👯‍♀️ 贡献

paopao-ce 是一个利用 业余时间 本着 "Just for fun just do it." 的心态 持续有序 开发/优化/维护的开源项目,没有KPI考核、没有Roadmap进度压力、没有技术支持日程安排,或许有些许不足之处,但是重在精神可嘉。 借用网络中的话 "F*k talk, f*k of tech innovation, Shut up and show me your code." 一切都因更好的体验,一切都是为了爱好,一切都在代码里;期待老铁们加入,一起开发、一起折腾、一起快乐。

喜欢的朋友记得给个Star,欢迎贡献PR。

Star History Chart

License

Distributed under the MIT License. See LICENSE for more information.

<!-- MARKDOWN LINKS & IMAGES -->