Skip to content

younthu/panda

Repository files navigation

Panda

Build

Panda是一个业务代码聚合引擎,Rails Engine. 所有功能开箱即用。常用的用户系统,缓存和任务系统, 消息推送, 短信验证码, 管理后台, etc.

Panda的终极目标是做成一个方案粘合剂,把各种开源方向黏合在一起,组成更加完整的解决方案。

  1. Project/Task management
    1. Redmine for task management
    2. Open project
  2. Spree for b2c online shop
  3. Things board for IoT
  4. ERP
    1. Odoo for erp
    2. https://ofbiz.apache.org/
  5. Wordpress for CRM
  6. Messaging/Chatting
    1. XMPP
    2. Rocket Chat

Quick start

  1. Add gems
    1. Add gem 'panda', git: 'https://github.com/younthu/panda.git' to Gemfile
  2. bundle install
  3. rails g panda:install, 拷贝各种代码和配置文件.it will call ./lib/generators/panda/install/install_generator.rb and install gems below:
    1. install config
      1. settings files
      2. zh-CN.yml
    2. mout panda to routes
    3. install migration files
    4. install user model
    5. install deply scripts
    6. install docker files
    7. config activeadmin addons
    8. initialize gems(rspec, rswag).
  4. rails g panda:initializer
  5. rails db:create && rails db:migrate
  6. start server: rails s
  7. start sidekiq(optional): sidekiq
  8. start rpush(optional): rpush start
  9. check app info: rails app:about

Setup

Api, rest api controller可以继承Panda::Api::Controller, 这个api包含了rest api登录的基本功能.

  1. 安装panda文件: 'rails g panda:install'
  2. 安装迁移文件:
    rails panda:install:migrations

后续步骤

  1. spec/rails_helper.rb里面添加FactoryBot的初始化代码
    RSpec.configure do |config|
      config.include FactoryBot::Syntax::Methods
      config.swagger_dry_run = false
      FactoryBot.reload

Demo

本项目包含一个dummy测试项目,可以通过docker-compose快速启动, 也可以手动在本地启动.

可以demo的基本内容:

  1. 一个管理后台,带角色权限管理系统。
  2. 带阿里云,支付宝,微信支付配置功能。需要系统运维权限。
  3. 一个spree电商系统。
  4. 一个会员系统。
  5. 一个约课系统。
  6. 聊天系统。
  7. 人物管理系统。
  8. 文档管理系统。
  9. 流程管理系统。

Docker compose快速启动

本地手动启动

目录结构

  1. 遵循传统的Rails项目结构。
  2. 这是一个Rails Engine, 多了一个Dummy App,所以代码目录结构在细节上和传统Rails项目有区别。

Settings

./config/readme.md

Features

Rpush

  1. start rpush(optional): rpush start
    1. Both two commands below work in mac, but, not in linux.
    2. send notification to a device: rails rpush:p8push_to_device["你好","BF1F297A3B62D1517BB19D5D67BD0BC72D438F94F016DAD6E2B175AE01BFC38D"]
    3. send notification to device: rails rpush:push_to_device["你好","BF1F297A3B62D1517BB19D5D67BD0BC72D438F94F016DAD6E2B175AE01BFC38D"]
  2. 升级rpush:
    1. 升级gem包: bundle update rpush
    2. 重新生成migration files: rpush init

微信支付

权限管理

  1. Panda::AdminRole是给后台用户角色定义用的。目前没有对一般用户权限做支持,可以在后期根据需求来添加。

Swagger

Test

  1. run rails test: rails test
    1. 注意fixture加载的方式: panda_users(:one), 需要加namespace panda_
  2. run dummy app in the root folder: 'rails s'.
    1. 魔法在panda/bin/rails里面. APP_PATH = File.expand_path('../test/dummy/config/application', __dir__)
  3. postman scripts.
  4. 后台登录: http://localhost:3000/admin

Development

  1. 更新版本号: lib/panda/version
  2. 调试panda的时候可以引用本地panda, 这样可以直接改panda的代码调试: gem 'panda', path: '../panda'
  3. 更新Swagger Api Doc: rspec --format Rswag::Specs::SwaggerFormatter --order defined

Rails tasks

Overriding Models and Controller

Overriding Models and Controller

Contributing

Contribution directions go here.

License

The gem is available as open source under the terms of the MIT License.

Roadmap

  1. User
    1. User model
    2. Rest api for Avatar upload
    3. Identity model
    4. Profile model
    5. 账户注销
    6. [] 拉黑
    7. [] 举报
    8. 会员等级
    9. captcha
    10. 新用户邀请
    11. 用户行为安全审计
      1. 登录信息记录
      2. 异地登录检测
      3. 实名验证
      4. 所有写操作记录。
      5. 禁用账户
    12. 组织结构
      1. 小组/团队
      2. 家庭
      3. 公司
      4. 安全组
    13. API token/password token, github api token like.
  2. 注册
    1. 邮箱注册
    2. 手机注册
  3. 集成ipapi数据库
  4. 集成ipinfo数据库
  5. 图形验证码.
  6. 隐私协议生成
  7. 保密协议生成
  8. Login with devise
    1. 手机登录
    2. 手机自动登录
    3. 微信登录
    4. 通过关注微信公众号来绑定账号
    5. 邮箱登录
    6. 账号密码登录
    7. 扫码登陆
    8. 苹果登录
  9. Feature Toggle
  10. 致敬redmine
    1. dynamic fields
    2. Workflow of ticket status.
  11. 聊天
  12. 站内信
  13. 基于Secure_token的token管理和身份认证.
  14. 目前secure_tokendevise不能同时在controller里面用,因为有命名冲突,current_userauthenticate_user!都冲突了。目前的解决办法是通过Panda.token_method == :secure_token来决定是用secure_token还是devise
  15. 目前登录时两种token都会返回. devise tokenauth_token下面, secure_tokensecure_token字段
  16. 切换token认证方式需要去panda.rb里面设置token_method, 用postman测试过myinfo api, secure_token是工作的.
  17. Login with wechat
  18. User
  19. 后台用户权限管理
    1. Roles
    2. Permissions
    3. 角色配置页面, 分管理员和用户
    4. 权限配置页面, 分管理员和用
  20. wx_pay, WechatMiniService from Tekapic.
  21. config gem with settings files.
  22. 常用可通用的功能写到subfolder里面以gem的形式加载.
  23. swagger
  24. Kaminari pagination
  25. Localization
  26. ElasticSearch
  27. Redis
  28. ELK Log
  29. Sidekiq
  30. Puma auto restart. 解决ruby内存泄漏到问题
  31. CORS
    1. 默认关闭CORS [//]: # ( 2. rails g panda:install 会生成config/cors/initilaizer.rb)
  32. OAuth
  33. JWT
  34. RPush
  35. Log rotation
  36. ActiveAdmin
    1. 后台
  37. 朋友圈
    1. 照片
    2. 文字
    3. 点赞
    4. 评论
    5. 搜索
    6. 订阅
  38. Panda installer
    1. 添加自动加载路径routes/*.rbconfig/application.rb里面去
    2. Install UsersController subclass to target app.
    3. Install API views to vendor folder as spree does.
  39. 基于数据库的配置
    1. config做基于文件的静态配置
    2. rails-settings-cached做基于数据库的动态配置管理,给运维人员用.
  40. 订单系统
  41. 支付系统
    1. 微信支付
    2. 支付宝支付
    3. 苹果支付
  42. spree商城
  43. sentry rails
  44. newrelic 免费版
  45. devise authentication in go
  46. MQTT
  47. Websocket/action cable
  48. Message Queue, kafka, 削峰填谷
  49. APIs in go
  50. nginx configuration
  51. APIs in python
    1. secure token authentication in python
    2. password authentication in python
  52. APIs in java
    1. secure token authentication in java
    2. password authentication in java
  53. 工作流引擎
    1. 请假流程审批
    2. 设计文档审批
    3. 可以参考
  54. Rails Settings Cached
  55. 禁用panda的dashboard, settings里面禁用
  56. 微信分享
  57. 收藏
  58. 点赞/Like
  59. 浏览历史
  60. App版本控制
  61. 类似Redmine的插件系统
  62. 用户运营
    1. 用户反馈,投诉建议
    2. 客服
    3. 积分系统
    4. 虚拟货币系统
    5. 抽奖系统
    6. 签到打卡
    7. 邀请注册
    8. 全局小喇叭
    9. 押金
    10. 红包
    11. 扫码核验核销
  63. 应用内广告, banner
  64. 分销系统
    1. 邀请注册
    2. 会员等级
    3. [ ]
  65. 会员卡系统
    1. 等级
    2. 金额
    3. 门票预约
    4. 课程预约
  66. 优惠券
    1. 无门槛现金券
    2. 满减券
    3. 兑换券
    4. Spree里面有优惠券, 可以参考一下.
  67. 调试
    1. 系统探针?
    2. 远程日志?
    3. 数据库数据记录自诊断
    4. 系统信息&系统配置页面, chef/ohai
    5. Impersonate, switch user, 扮演其他账号做测试,调试。
  68. 测试
    1. UT
    2. Postman
    3. Jmeter
  69. Docker
    1. Docker文件
    2. Docker-compose文件
    3. Docker-compose for dummy
    4. K8S Helm Chart
  70. 运维
    1. 拷贝ansible scripts from yoga
    2. 拷贝ansible scripts with panda:install
    3. 在线重启app
  71. 技术文档,gitbook.
  72. 用户基本的API request频率限制, 防止攻击.
  73. 自定义字段
    1. 表内固定自定义字段,省去跨表的成本,数量有限,但是性能好。
    2. 表外自定义字段,像redmine里面的自定义字段,还有spree里面的自定义字段,无限制,但是跨表消耗大一些。
  74. B2B2C后台

Rails generators

  1. Docker-compose template generator
  2. Panda settings generator(config rb and settings yaml)
    1. ansible scripts
    2. 添加自动加载路径routes/*.rbconfig/application.rb里面去
    3. Install UsersController subclass to target app.
    4. Install API views to vendor folder as spree does.
  3. Seeds generator
  4. Generator网页,点击直接生成目标内容的界面。
  5. API/rspec Generator from Gu
    1. 说明见lib/generators/panda/readme.md
  6. 小程序generator
  7. React Native app generator
  8. Ant Design Admin pages Generator
  9. 安全审查
    1. 文字审查
    2. 图片审查
  10. 图片处理,用imagick + sidekiq处理。
  11. 缩略图
  12. [ ]

性能问题

常用来讲,性能问题不可避免。性能问题需要通过微服务架构来解决,规划如下:

  1. rails做快速业务开发和数据库建模,常用的业务逻辑和代码就落到panda里面去。
  2. Rails在某些情况下会存在API并发上的问题,对某些性能敏感的API,用go或者java去处理. 也就是某些模块一个API会有两套实现,一套是Rails的,成熟以后用go或者java再实现一遍。
  3. 两套API挂不同的namespace下面,用nginx做路由转发。
  4. 两套API必然会遇到用户认证的问题,前期可以两边各自实现,到后期可以考虑用kong之类的网关工具做用户认证。
  5. 以后可以用这套模板代码批量做系统。
  6. 短期内(1到2年)只需要集中精力在第1点就可以了。

设计原则

  1. 多用callbacks, 方便做定制化。
  2. 先直接做成单体应用,再考虑拆gem, 第三步再考虑拆服务。

Notes

  1. Rails Engine和Rails Plugin的区别.
  2. 加载本地gem: gem 'core', path: '../core'

Famous engine

  1. Rails is the biggest engine.
  2. Thredded, Thredded is a Rails 4.2+ forum/messageboard engine. Its goal is to be as simple and feature rich as possible.
  3. Spree,Spree is a complete open source e-commerce solution built with Ruby on Rails.
  4. Devise,Flexible authentication solution for Rails with Warden.

Famous Rails app(open sourced)

  1. Discourse

Useful gems

Useful links

  1. Start with rails engine
  2. A Guide to Rails Engines in the Wild: Real World Examples of Rails Engines in Action
  3. Rails 引擎初探

notes

  1. 默认Engine不会加载gemspec里面的内容,导致uninitialized constant DeviseTokenAuth错误. 解决办法:

    # 把下面的内容加入到lib/panda.rb顶部, https://stackoverflow.com/questions/5159607/rails-engine-gems-dependencies-how-to-load-them-into-the-application
    # requires all dependencies
     Gem.loaded_specs['yourengine'].dependencies.each do |d|
     require d.name
     end
  2. ActiveAdmin routes放engine namespace下面会导致资源加载的问题,解决办法是把routes放Rails.application.routes.draw do下面, 具体细节查看routes/api.rb.

  3. panda.gemspec里面添加spec.add_development_dependency会导致依赖项在目标项目中不会被安装。用spec.add_dependency则不会有这个问题。

  4. 自定义migration files加载路径:

    # ./test/test_helper.rb
    ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)]

    Rails Engine会根据变量ENGINE_ROOT自动添加migrate path:

    #activerecord/lib/active_record/railtie.rb:42,
         task :load_config do
           if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
             if engine.paths["db/migrate"].existent
               ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
             end
           end
         end
    1. panda engine做了自动加载engine migration files的配置, 所以不需要手动rails panda:install:migrations:
      # lib/panda/engine.rb
      config.paths["db/migrate"].expanded.each do |expanded_path|
          app.config.paths["db/migrate"] << expanded_path
       end
  5. sqlite可以存jsonb, 查看yoga.user

  6. 每改一行engine里面的代码,dummy的routes就会奔溃,得重启rails s

  7. rails在debug模式下会渲染exception in html.

    1. 解决办法: 在basecontroller.rb里面加rescue_from ActiveRecord::RecordInvalid,
    2. 打印exception in json: config.debug_exception_response_format = :api
    3. https://www.wyeworks.com/blog/2016/01/12/improvements-to-error-responses-in-rails-5-api-mode/

更改json的渲染layout

继承Panda::Api:BaseController以后就会默认使用带分页功能的layout, 有几种办法可以避免用panda带的layout

  1. 在API里面通过layout指令来指定模版: layout 'panda/layouts/application', 具体参考 Panda::Api::BaseController.
  2. 在controller里指定不使用layout: layout false, 具体参考 Panda::Api::BaseController.
  3. render的时候不使用layout: render :index, layout: false

mount activeadmin inside engine

  1. Define a resource inside an engine
  2. Example Engines

scripts

  1. bundle exec rubocop --parallel
  2. rubocop --auto-correct