├── .gitignore ├── .gitmodules ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── Rakefile ├── app ├── controllers │ └── serve │ │ ├── admin │ │ ├── base_controller.rb │ │ ├── home_controller.rb │ │ ├── servers_controller.rb │ │ └── services_controller.rb │ │ ├── base_controller.rb │ │ ├── me │ │ ├── base_controller.rb │ │ └── servings_controller.rb │ │ ├── my │ │ ├── base_controller.rb │ │ └── servings_controller.rb │ │ ├── servers_controller.rb │ │ ├── services_controller.rb │ │ └── servings_controller.rb ├── jobs │ └── .keep ├── models │ ├── serve.rb │ └── serve │ │ ├── ext │ │ ├── item.rb │ │ └── member.rb │ │ ├── model │ │ ├── server.rb │ │ ├── service.rb │ │ └── serving.rb │ │ ├── server.rb │ │ ├── service.rb │ │ └── serving.rb └── views │ ├── admin │ └── _serve_nav.html.erb │ ├── me │ ├── _serve_nav.html+phone.erb │ └── _serve_nav.html.erb │ └── serve │ ├── admin │ ├── base │ │ └── _nav.html.erb │ ├── home │ │ └── index.html.erb │ ├── servers │ │ ├── _form.html.erb │ │ ├── _index │ │ │ ├── _breadcrumb.html.erb │ │ │ ├── _index_tbody.html.erb │ │ │ └── _index_thead.html.erb │ │ └── _show_table.html.erb │ └── services │ │ ├── _card_form.html.erb │ │ ├── _form.html.erb │ │ ├── _index │ │ ├── _index_tbody.html.erb │ │ ├── _index_thead.html.erb │ │ └── _index_tr.html.erb │ │ ├── _show_table.html.erb │ │ ├── _wallet_form.html.erb │ │ ├── card.html.erb │ │ ├── update_card.turbo_stream.erb │ │ ├── update_wallet.turbo_stream.erb │ │ └── wallet.html.erb │ ├── me │ └── servings │ │ ├── _index │ │ └── _index_tbody.html.erb │ │ ├── _qrcode │ │ ├── _buttons.html.erb │ │ ├── _package.html.erb │ │ ├── _packages.html.erb │ │ ├── _serving.html.erb │ │ └── _tab_bar_footer.html.erb │ │ ├── finish.turbo_stream.erb │ │ ├── index.html+phone.erb │ │ ├── qrcode.html.erb │ │ └── start.turbo_stream.erb │ ├── my │ └── servings │ │ ├── _index │ │ ├── _serving.html+phone.erb │ │ ├── _serving_preview.html.erb │ │ └── _top_bar.html+phone.erb │ │ └── index.html+phone.erb │ └── services │ ├── _base │ ├── _cart.html.erb │ └── _tab_bar_footer.html.erb │ ├── _index │ ├── _index_table.html+phone.erb │ ├── _index_tbody.html+phone.erb │ └── _index_tr.html+phone.erb │ └── index.html+phone.erb ├── bin └── rails ├── config ├── locales │ ├── zh.attributes.yml │ └── zh.controller.yml └── routes.rb ├── lib ├── rails_serve.rb └── rails_serve │ └── engine.rb ├── log └── .keep ├── package.gemspec └── test ├── controllers ├── .keep └── serve │ └── admin │ ├── servers_controller_test.rb │ └── services_controller_test.rb ├── fixtures └── files │ └── .keep ├── helpers └── .keep ├── integration ├── .keep └── navigation_test.rb ├── mailers └── .keep ├── models └── .keep ├── rails_serve_test.rb ├── system └── serve │ └── admin │ ├── servers_test.rb │ └── services_test.rb └── test_helper.rb /.gitignore: -------------------------------------------------------------------------------- 1 | .bundle/ 2 | docs/ 3 | db/ 4 | node_modules/ 5 | log/*.log 6 | tmp/**/*.* 7 | !tmp/.keep 8 | !tmp/sockets/.keep 9 | 10 | *.gem 11 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "docker"] 2 | path = docker 3 | url = git@github.com:work-design/docker.git 4 | [submodule "test/dummy"] 5 | path = test/dummy 6 | url = https://github.com/work-design/dummy.git 7 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 | gemspec 4 | 5 | gem 'rails' 6 | gem 'pg' 7 | gem 'propshaft' 8 | 9 | gem 'rails_extend', github: 'work-design/rails_extend' 10 | gem 'rails_com', github: 'work-design/rails_com' 11 | gem 'rails_design', github: 'work-design/rails_design' 12 | gem 'rails_org', github: 'work-design/rails_org' 13 | 14 | gem 'amazing_print' 15 | group :development, :test do 16 | gem 'debug' 17 | gem 'sdoc' 18 | end 19 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/work-design/rails_com.git 3 | revision: d5dbbf2bf3f2339e02dbbe0574515f54645f06e7 4 | specs: 5 | rails_com (1.3.0) 6 | acme-client 7 | acts_as_list (>= 1.0) 8 | closure_tree (>= 7.3) 9 | default_where (~> 2.2) 10 | http-form_data (~> 2.3) 11 | httpx 12 | kaminari 13 | net-http 14 | rails (>= 7.0) 15 | rails_extend 16 | turbo-rails 17 | 18 | GIT 19 | remote: https://github.com/work-design/rails_design.git 20 | revision: 0c91c6d8e907da01b1af5cf4ce8bcd80b394f9be 21 | specs: 22 | rails_design (0.0.1) 23 | rails 24 | 25 | GIT 26 | remote: https://github.com/work-design/rails_extend.git 27 | revision: 3968d51ec1c68eaf846fd4e4238163a3d32f0c4f 28 | specs: 29 | rails_extend (1.0.1) 30 | rails (>= 5.0) 31 | 32 | GIT 33 | remote: https://github.com/work-design/rails_org.git 34 | revision: aa7a59af6f3bad28eb85b59a72a3b9a20f75a52b 35 | specs: 36 | rails_org (0.0.1) 37 | rails_com (~> 1.2) 38 | 39 | PATH 40 | remote: . 41 | specs: 42 | rails_serve (0.0.1) 43 | rails (>= 7.0.3.1) 44 | 45 | GEM 46 | remote: https://rubygems.org/ 47 | specs: 48 | acme-client (2.0.11) 49 | faraday (>= 1.0, < 3.0.0) 50 | faraday-retry (~> 1.0) 51 | actioncable (7.0.3.1) 52 | actionpack (= 7.0.3.1) 53 | activesupport (= 7.0.3.1) 54 | nio4r (~> 2.0) 55 | websocket-driver (>= 0.6.1) 56 | actionmailbox (7.0.3.1) 57 | actionpack (= 7.0.3.1) 58 | activejob (= 7.0.3.1) 59 | activerecord (= 7.0.3.1) 60 | activestorage (= 7.0.3.1) 61 | activesupport (= 7.0.3.1) 62 | mail (>= 2.7.1) 63 | net-imap 64 | net-pop 65 | net-smtp 66 | actionmailer (7.0.3.1) 67 | actionpack (= 7.0.3.1) 68 | actionview (= 7.0.3.1) 69 | activejob (= 7.0.3.1) 70 | activesupport (= 7.0.3.1) 71 | mail (~> 2.5, >= 2.5.4) 72 | net-imap 73 | net-pop 74 | net-smtp 75 | rails-dom-testing (~> 2.0) 76 | actionpack (7.0.3.1) 77 | actionview (= 7.0.3.1) 78 | activesupport (= 7.0.3.1) 79 | rack (~> 2.0, >= 2.2.0) 80 | rack-test (>= 0.6.3) 81 | rails-dom-testing (~> 2.0) 82 | rails-html-sanitizer (~> 1.0, >= 1.2.0) 83 | actiontext (7.0.3.1) 84 | actionpack (= 7.0.3.1) 85 | activerecord (= 7.0.3.1) 86 | activestorage (= 7.0.3.1) 87 | activesupport (= 7.0.3.1) 88 | globalid (>= 0.6.0) 89 | nokogiri (>= 1.8.5) 90 | actionview (7.0.3.1) 91 | activesupport (= 7.0.3.1) 92 | builder (~> 3.1) 93 | erubi (~> 1.4) 94 | rails-dom-testing (~> 2.0) 95 | rails-html-sanitizer (~> 1.1, >= 1.2.0) 96 | activejob (7.0.3.1) 97 | activesupport (= 7.0.3.1) 98 | globalid (>= 0.3.6) 99 | activemodel (7.0.3.1) 100 | activesupport (= 7.0.3.1) 101 | activerecord (7.0.3.1) 102 | activemodel (= 7.0.3.1) 103 | activesupport (= 7.0.3.1) 104 | activestorage (7.0.3.1) 105 | actionpack (= 7.0.3.1) 106 | activejob (= 7.0.3.1) 107 | activerecord (= 7.0.3.1) 108 | activesupport (= 7.0.3.1) 109 | marcel (~> 1.0) 110 | mini_mime (>= 1.1.0) 111 | activesupport (7.0.3.1) 112 | concurrent-ruby (~> 1.0, >= 1.0.2) 113 | i18n (>= 1.6, < 2) 114 | minitest (>= 5.1) 115 | tzinfo (~> 2.0) 116 | acts_as_list (1.0.4) 117 | activerecord (>= 4.2) 118 | amazing_print (1.4.0) 119 | builder (3.2.4) 120 | closure_tree (7.4.0) 121 | activerecord (>= 4.2.10) 122 | with_advisory_lock (>= 4.0.0) 123 | concurrent-ruby (1.1.10) 124 | crass (1.0.6) 125 | debug (1.6.2) 126 | irb (>= 1.3.6) 127 | reline (>= 0.3.1) 128 | default_where (2.2.0) 129 | activerecord (>= 4.0.0) 130 | digest (3.1.0) 131 | erubi (1.11.0) 132 | faraday (2.5.2) 133 | faraday-net_http (>= 2.0, < 3.1) 134 | ruby2_keywords (>= 0.0.4) 135 | faraday-net_http (3.0.0) 136 | faraday-retry (1.0.3) 137 | globalid (1.0.0) 138 | activesupport (>= 5.0) 139 | http-2-next (0.5.0) 140 | http-form_data (2.3.0) 141 | httpx (0.21.0) 142 | http-2-next (>= 0.4.1) 143 | i18n (1.12.0) 144 | concurrent-ruby (~> 1.0) 145 | io-console (0.5.11) 146 | irb (1.4.1) 147 | reline (>= 0.3.0) 148 | kaminari (1.2.2) 149 | activesupport (>= 4.1.0) 150 | kaminari-actionview (= 1.2.2) 151 | kaminari-activerecord (= 1.2.2) 152 | kaminari-core (= 1.2.2) 153 | kaminari-actionview (1.2.2) 154 | actionview 155 | kaminari-core (= 1.2.2) 156 | kaminari-activerecord (1.2.2) 157 | activerecord 158 | kaminari-core (= 1.2.2) 159 | kaminari-core (1.2.2) 160 | loofah (2.18.0) 161 | crass (~> 1.0.2) 162 | nokogiri (>= 1.5.9) 163 | mail (2.7.1) 164 | mini_mime (>= 0.1.1) 165 | marcel (1.0.2) 166 | method_source (1.0.0) 167 | mini_mime (1.1.2) 168 | minitest (5.16.3) 169 | net-http (0.2.2) 170 | uri 171 | net-imap (0.2.3) 172 | digest 173 | net-protocol 174 | strscan 175 | net-pop (0.1.1) 176 | digest 177 | net-protocol 178 | timeout 179 | net-protocol (0.1.3) 180 | timeout 181 | net-smtp (0.3.1) 182 | digest 183 | net-protocol 184 | timeout 185 | nio4r (2.5.8) 186 | nokogiri (1.13.8-arm64-darwin) 187 | racc (~> 1.4) 188 | pg (1.4.3) 189 | propshaft (0.6.4) 190 | actionpack (>= 7.0.0) 191 | activesupport (>= 7.0.0) 192 | rack 193 | railties (>= 7.0.0) 194 | psych (4.0.4) 195 | stringio 196 | racc (1.6.0) 197 | rack (2.2.4) 198 | rack-test (2.0.2) 199 | rack (>= 1.3) 200 | rails (7.0.3.1) 201 | actioncable (= 7.0.3.1) 202 | actionmailbox (= 7.0.3.1) 203 | actionmailer (= 7.0.3.1) 204 | actionpack (= 7.0.3.1) 205 | actiontext (= 7.0.3.1) 206 | actionview (= 7.0.3.1) 207 | activejob (= 7.0.3.1) 208 | activemodel (= 7.0.3.1) 209 | activerecord (= 7.0.3.1) 210 | activestorage (= 7.0.3.1) 211 | activesupport (= 7.0.3.1) 212 | bundler (>= 1.15.0) 213 | railties (= 7.0.3.1) 214 | rails-dom-testing (2.0.3) 215 | activesupport (>= 4.2.0) 216 | nokogiri (>= 1.6) 217 | rails-html-sanitizer (1.4.3) 218 | loofah (~> 2.3) 219 | railties (7.0.3.1) 220 | actionpack (= 7.0.3.1) 221 | activesupport (= 7.0.3.1) 222 | method_source 223 | rake (>= 12.2) 224 | thor (~> 1.0) 225 | zeitwerk (~> 2.5) 226 | rake (13.0.6) 227 | rdoc (6.4.0) 228 | psych (>= 4.0.0) 229 | reline (0.3.1) 230 | io-console (~> 0.5) 231 | ruby2_keywords (0.0.5) 232 | sdoc (2.4.0) 233 | rdoc (>= 5.0) 234 | stringio (3.0.2) 235 | strscan (3.0.4) 236 | thor (1.2.1) 237 | timeout (0.3.0) 238 | turbo-rails (1.1.1) 239 | actionpack (>= 6.0.0) 240 | activejob (>= 6.0.0) 241 | railties (>= 6.0.0) 242 | tzinfo (2.0.5) 243 | concurrent-ruby (~> 1.0) 244 | uri (0.11.0) 245 | websocket-driver (0.7.5) 246 | websocket-extensions (>= 0.1.0) 247 | websocket-extensions (0.1.5) 248 | with_advisory_lock (4.6.0) 249 | activerecord (>= 4.2) 250 | zeitwerk (2.6.0) 251 | 252 | PLATFORMS 253 | arm64-darwin-21 254 | 255 | DEPENDENCIES 256 | amazing_print 257 | debug 258 | pg 259 | propshaft 260 | rails 261 | rails_com! 262 | rails_design! 263 | rails_extend! 264 | rails_org! 265 | rails_serve! 266 | sdoc 267 | 268 | BUNDLED WITH 269 | 2.3.7 270 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022-Present Mingyuan Qin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RailsServe 2 | Short description and motivation. 3 | 4 | ## Usage 5 | How to use my plugin. 6 | 7 | ## Installation 8 | Add this line to your application's Gemfile: 9 | 10 | ```ruby 11 | gem "rails_serve" 12 | ``` 13 | 14 | And then execute: 15 | ```bash 16 | $ bundle 17 | ``` 18 | 19 | Or install it yourself as: 20 | ```bash 21 | $ gem install rails_serve 22 | ``` 23 | 24 | ## Contributing 25 | Contribution directions go here. 26 | 27 | ## License 28 | The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). 29 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | 3 | APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__) 4 | load "rails/tasks/engine.rake" 5 | 6 | load "rails/tasks/statistics.rake" 7 | 8 | require "bundler/gem_tasks" 9 | -------------------------------------------------------------------------------- /app/controllers/serve/admin/base_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Admin::BaseController < AdminController 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/serve/admin/home_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Admin::HomeController < Admin::BaseController 3 | 4 | def index 5 | end 6 | 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/controllers/serve/admin/servers_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Admin::ServersController < Admin::BaseController 3 | before_action :set_service 4 | before_action :set_new_server, only: [:new, :create] 5 | before_action :set_members, only: [:new, :create, :edit, :update] 6 | 7 | private 8 | def set_service 9 | @service = Service.find params[:service_id] 10 | end 11 | 12 | def set_new_server 13 | @server = @service.servers.build(server_params) 14 | end 15 | 16 | def set_members 17 | @members = Org::Member.default_where(default_params) 18 | end 19 | 20 | def server_params 21 | params.fetch(:server, {}).permit( 22 | :name, 23 | :member_id 24 | ) 25 | end 26 | 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /app/controllers/serve/admin/services_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Admin::ServicesController < Admin::BaseController 3 | before_action :set_service, only: [ 4 | :show, :edit, :update, :destroy, :actions, 5 | :wallet, :update_wallet, :card, :update_card 6 | ] 7 | 8 | def wallet 9 | @wallet_templates = Trade::WalletTemplate.default_where(default_params) 10 | end 11 | 12 | def update_wallet 13 | @service.wallet_price = wallet_price_params 14 | @service.save 15 | end 16 | 17 | def card 18 | @card_templates = Trade::CardTemplate.default_where(default_params) 19 | end 20 | 21 | def update_card 22 | @service.card_price = card_price_params 23 | @service.save 24 | end 25 | 26 | private 27 | def set_service 28 | @service = Service.find params[:id] 29 | end 30 | 31 | def wallet_price_params 32 | r = {} 33 | 34 | params.fetch(:service, {}).fetch(:wallet_price, {}).each do |_, v| 35 | r.merge! v[:code] => v[:price] 36 | end 37 | 38 | r 39 | end 40 | 41 | def card_price_params 42 | r = {} 43 | 44 | params.dig(:service, :card_price).each do |_, v| 45 | r.merge! v[:code] => v[:price] 46 | end 47 | 48 | r 49 | end 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /app/controllers/serve/base_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class BaseController < ApplicationController 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/serve/me/base_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Me::BaseController < MeController 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/serve/me/servings_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Me::ServingsController < Me::BaseController 3 | before_action :set_serving, only: [:qrcode, :start, :finish] 4 | 5 | def index 6 | @servings = current_member.servings.page(params[:page]) 7 | end 8 | 9 | def qrcode 10 | 11 | end 12 | 13 | def start 14 | @serving.member = current_member 15 | @serving.start_at = Time.current 16 | @serving.save 17 | end 18 | 19 | def finish 20 | @serving.finish_at = Time.current 21 | @serving.save 22 | end 23 | 24 | private 25 | def set_serving 26 | @serving = Serving.find params[:id] 27 | end 28 | 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /app/controllers/serve/my/base_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class My::BaseController < MyController 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/serve/my/servings_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class My::ServingsController < My::BaseController 3 | before_action :set_item 4 | 5 | def index 6 | @servings = @item.servings 7 | end 8 | 9 | private 10 | def set_item 11 | @item = Trade::Item.find params[:item_id] 12 | end 13 | 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/controllers/serve/servers_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class ServersController < BaseController 3 | before_action :set_service 4 | 5 | private 6 | def set_service 7 | @service = Service.find params[:service_id] 8 | end 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/controllers/serve/services_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class ServicesController < BaseController 3 | before_action :set_cart 4 | 5 | def index 6 | @services = Service.default_where(default_params) 7 | end 8 | 9 | def set_cart 10 | @cart = current_carts.find_or_create_by(good_type: 'Serve::Service', aim: 'use') 11 | end 12 | 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/controllers/serve/servings_controller.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class ServingsController < BaseController 3 | before_action :require_login 4 | before_action :set_serving, only: [:qrcode] 5 | 6 | def qrcode 7 | if current_user.organ_ids.include?(@serving.service.organ_id) 8 | redirect_to({ controller: 'serve/me/servings', action: 'qrcode', id: params[:id], host: @serving.service.organ.host }, allow_other_host: true) 9 | end 10 | end 11 | 12 | private 13 | def set_serving 14 | @serving = Serving.find params[:id] 15 | end 16 | 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/jobs/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/app/jobs/.keep -------------------------------------------------------------------------------- /app/models/serve.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | 3 | def self.use_relative_model_naming? 4 | true 5 | end 6 | 7 | def self.table_name_prefix 8 | 'serve_' 9 | end 10 | 11 | end 12 | -------------------------------------------------------------------------------- /app/models/serve/ext/item.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | module Ext::Item 3 | extend ActiveSupport::Concern 4 | 5 | included do 6 | has_many :servings, class_name: 'Serve::Serving' 7 | end 8 | 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/serve/ext/member.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | module Ext::Member 3 | extend ActiveSupport::Concern 4 | 5 | included do 6 | has_many :servings, class_name: 'Serve::Serving' 7 | end 8 | 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/serve/model/server.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | module Model::Server 3 | extend ActiveSupport::Concern 4 | 5 | included do 6 | attribute :name, :string 7 | 8 | belongs_to :service 9 | belongs_to :member, class_name: 'Org::Member' 10 | end 11 | 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/serve/model/service.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | module Model::Service 3 | extend ActiveSupport::Concern 4 | 5 | included do 6 | attribute :name, :string 7 | 8 | belongs_to :organ, class_name: 'Org::Organ', optional: true 9 | 10 | has_many :servers, dependent: :destroy 11 | has_many :members, through: :servers 12 | has_many :servings 13 | end 14 | 15 | def order_paid(item) 16 | rest = item.number - item.servings.count 17 | rest.times do 18 | servings.build(item_id: item.id) 19 | end 20 | save 21 | end 22 | 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /app/models/serve/model/serving.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | module Model::Serving 3 | extend ActiveSupport::Concern 4 | 5 | included do 6 | attribute :start_at, :datetime 7 | attribute :finish_at, :datetime 8 | attribute :estimate_finish_at, :datetime 9 | 10 | belongs_to :service 11 | belongs_to :server, optional: true 12 | belongs_to :member, class_name: 'Org::Member', optional: true 13 | belongs_to :wallet_payment, class_name: 'Trade::WalletPayment', optional: true 14 | belongs_to :item, class_name: 'Trade::Item' 15 | 16 | after_save_commit :send_notice, if: -> { (saved_changes.keys & ['member_id', 'start_at', 'finish_at']).present? } 17 | end 18 | 19 | def sync_from 20 | 21 | end 22 | 23 | def enter_url 24 | Rails.application.routes.url_for(controller: 'serve/servings', action: 'qrcode', id: self.id, host: item.organ.host) 25 | end 26 | 27 | def qrcode_enter_png 28 | QrcodeHelper.code_png(enter_url, border_modules: 0, fill: 'pink') 29 | end 30 | 31 | def qrcode_enter_url 32 | QrcodeHelper.data_url(enter_url) 33 | end 34 | 35 | def send_notice 36 | broadcast_action_to( 37 | self, 38 | action: :update, 39 | target: "serving_#{id}", 40 | partial: 'serve/my/servings/_index/serving_preview', 41 | locals: { model: self } 42 | ) 43 | end 44 | 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /app/models/serve/server.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Server < ApplicationRecord 3 | include Model::Server 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/models/serve/service.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Service < ApplicationRecord 3 | include Trade::Ext::Good 4 | include Model::Service 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/models/serve/serving.rb: -------------------------------------------------------------------------------- 1 | module Serve 2 | class Serving < ApplicationRecord 3 | include Model::Serving 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/admin/_serve_nav.html.erb: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | <%= t('serve.admin.title') %> 5 | 6 | 7 | 10 |
11 | -------------------------------------------------------------------------------- /app/views/me/_serve_nav.html+phone.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | <%= t('serve.me.title') %> 5 |
6 |
7 |
8 | <%= link_to({ controller: 'serve/me/servings' }, class: 'column has-block-centered') do %> 9 |
10 | 11 |
12 |
<%= t('serve.me.servings.index.title') %>
13 | <% end %> 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /app/views/me/_serve_nav.html.erb: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /app/views/serve/admin/base/_nav.html.erb: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /app/views/serve/admin/home/index.html.erb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/app/views/serve/admin/home/index.html.erb -------------------------------------------------------------------------------- /app/views/serve/admin/servers/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= f.text_field :name %> 2 | <%= f.collection_select :member_id, @members, :id, :name %> 3 | -------------------------------------------------------------------------------- /app/views/serve/admin/servers/_index/_breadcrumb.html.erb: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /app/views/serve/admin/servers/_index/_index_tbody.html.erb: -------------------------------------------------------------------------------- 1 | <%= model.name %> 2 | 3 |
4 | <%= image_tag model.member.avatar, class: 'image is-24x24' if model.member.avatar.attached? %> 5 | <%= model.member.name %> 6 |
7 | 8 | -------------------------------------------------------------------------------- /app/views/serve/admin/servers/_index/_index_thead.html.erb: -------------------------------------------------------------------------------- 1 | <%= Serve::Server.human_attribute_name(:name) %> 2 | <%= Serve::Server.human_attribute_name(:member_id) %> 3 | -------------------------------------------------------------------------------- /app/views/serve/admin/servers/_show_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <%= Serve::Server.human_attribute_name(:name) %> 3 | <%= @server.name %> 4 | 5 | 6 | <%= Serve::Server.human_attribute_name(:member_id) %> 7 | <%= @server.member_id %> 8 | 9 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_card_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_with model: @service, url: { action: 'update_card' } do |f| %> 2 | <%= render 'error_messages', target: f.object %> 3 | <% @card_templates.each do |card_template| %> 4 | <%= f.fields :card_price, all: { normal: nil }, wrap: { input: 'field' } do |ef| %> 5 |
6 | 7 |
8 | <%= ef.hidden_field :code, value: card_template.code, index: card_template.id, disabled: !@service.card_price.key?(card_template.code) %> 9 | <%= ef.number_field :price, step: 0.01, value: @service.card_price.fetch(card_template.code, @service.price), index: card_template.id, disabled: !@service.card_price.key?(card_template.code) %> 10 |
11 | 12 | 13 |
14 |
15 |
16 | <% end %> 17 | <% end %> 18 | <%= f.submit %> 19 | <% end %> 20 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= f.text_field :name %> 2 | <%= f.number_field :price %> 3 | <%= f.text_field :unit %> 4 | <%= f.file_field :logo %> 5 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_index/_index_tbody.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | <%= image_tag model.logo, class: 'image is-24x24' if model.logo.attached? %> 4 | <%= model.name %> 5 |
6 | 7 | <%= model.price %> 8 | 9 |
10 | <% model.card_price.each do |key, value| %> 11 |
12 |
<%= key %>
13 |
<%= value.to_money.format(html_wrap: true).html_safe %>
14 |
15 | <% end %> 16 |
17 | <%= link_to({ action: 'card', id: model.id }, data: { turbo_frame: 'modal', show_target: 'item' }, aria: { label: t('serve.admin.services.card.title') }) do %> 18 | 19 | <% end %> 20 | 21 | 22 |
23 | <% model.wallet_price.each do |key, value| %> 24 |
25 |
<%= key %>
26 |
27 | <%= value %> 28 |
29 |
30 | <% end %> 31 |
32 | <%= link_to({ action: 'wallet', id: model.id }, data: { turbo_frame: 'modal', show_target: 'item' }, aria: { label: t('serve.admin.services.wallet.title') }) do %> 33 | 34 | <% end %> 35 | 36 | <%= model.unit %> 37 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_index/_index_thead.html.erb: -------------------------------------------------------------------------------- 1 | <%= Serve::Service.human_attribute_name(:name) %> 2 | <%= Serve::Service.human_attribute_name(:price) %> 3 | <%= Serve::Service.human_attribute_name(:card_price) %> 4 | <%= Serve::Service.human_attribute_name(:wallet_price) %> 5 | <%= Serve::Service.human_attribute_name(:unit) %> 6 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_index/_index_tr.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <%= yield %> 3 | 4 |
5 | <%= link_to({ controller: 'servers', service_id: model.id }, aria: { label: t('serve.admin.servers.index.title') }, class: 'button is-small is-rounded is-light') do %> 6 | 7 | <% end %> 8 | <%= link_to({ action: 'show', id: model.id }, data: { turbo_frame: 'modal' }, aria: { label: t('.show') }, class: 'button is-small is-rounded is-light') do %> 9 | 10 | <% end %> 11 | <%= link_to({ action: 'edit', id: model.id }, data: { turbo_frame: 'modal', turbo_scroll: true }, aria: { label: t('.edit') }, class: 'button is-small is-rounded is-light') do %> 12 | 13 | <% end %> 14 | <%= button_to({ action: 'destroy', id: model.id }, method: :delete, aria: { label: t('.destroy') }, class: 'button is-small is-rounded is-light', form: { data: { turbo_confirm: t('.confirm'), turbo_scroll: true } }) do %> 15 | 16 | <% end %> 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_show_table.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <%= Serve::Service.human_attribute_name(:name) %> 3 | <%= @service.name %> 4 | 5 | 6 | <%= Serve::Service.human_attribute_name(:price) %> 7 | <%= @service.price %> 8 | 9 | 10 | <%= Serve::Service.human_attribute_name(:card_price) %> 11 | <%= @service.card_price %> 12 | 13 | 14 | <%= Serve::Service.human_attribute_name(:unit) %> 15 | <%= @service.unit %> 16 | 17 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/_wallet_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_with model: @service, url: { action: 'update_wallet' } do |f| %> 2 | <%= render 'error_messages', target: f.object %> 3 | <% @wallet_templates.each do |wallet_template| %> 4 | <%= f.fields :wallet_price, all: { normal: nil }, wrap: { input: 'field' } do |ef| %> 5 |
6 | 7 |
8 | <%= ef.hidden_field :code, value: wallet_template.code, index: wallet_template.id, disabled: !@service.wallet_price.key?(wallet_template.code) %> 9 | <%= ef.number_field :price, step: wallet_template.step, value: @service.wallet_price.fetch(wallet_template.code, wallet_template.step), index: wallet_template.id, disabled: !@service.wallet_price.key?(wallet_template.code) %> 10 |
11 | <%= wallet_template.unit %> 12 | 13 | 14 |
15 |
16 |
17 | <% end %> 18 | <% end %> 19 | <%= f.submit %> 20 | <% end %> 21 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/card.html.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_frame_tagged 'modal' do %> 2 | <%= render partial: 'card_form' %> 3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/update_card.turbo_stream.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_stream.append 'body', partial: 'visit' %> 2 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/update_wallet.turbo_stream.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_stream.append 'body', partial: 'visit' %> 2 | -------------------------------------------------------------------------------- /app/views/serve/admin/services/wallet.html.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_frame_tagged 'modal' do %> 2 | <%= render partial: 'wallet_form' %> 3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_index/_index_tbody.html.erb: -------------------------------------------------------------------------------- 1 |

2 | <%= model.service.name %> 3 |

4 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_qrcode/_buttons.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <% if @serving.start_at.blank? %> 4 | <%= button_to({ action: 'start' }, method: :patch, class: 'button is-warning') do %> 5 | 开始服务 6 | <% end %> 7 | <% end %> 8 | <%= button_to({ action: 'finish' }, method: :patch, class: 'button is-danger') do %> 9 | 结束服务 10 | <% end %> 11 |
12 |
13 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_qrcode/_package.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= model.id %> 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_qrcode/_packages.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= render partial: 'package', collection: @box.packages, as: :model %> 9 |
<%= Ship::Package.human_attribute_name(:id) %><%= Ship::Package.human_attribute_name(:boxed_in_at) %>
10 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_qrcode/_serving.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | <%= @serving.service.name %> 6 |
7 |
8 | 9 | <%= @serving.item.uuid %> 10 |
11 |
12 | 13 | 14 | <%= @serving.member&.name %> 15 | 16 |
17 |
18 | 19 | 20 | 21 | 22 |
23 |
24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/_qrcode/_tab_bar_footer.html.erb: -------------------------------------------------------------------------------- 1 |
2 | <%= render 'buttons' %> 3 |
4 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/finish.turbo_stream.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_stream.append 'body' do %> 2 |
3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/index.html+phone.erb: -------------------------------------------------------------------------------- 1 | <%= render 'top_bar' %> 2 | <%= render 'filter_form' %> 3 | <%= render 'filter_table' %> 4 | 5 | <%= render layout: 'index_table' do %> 6 | <%= render partial: 'index_tbody', layout: 'index_tr', collection: @servings, as: :model %> 7 | <% end %> 8 | 9 | <%= paginate @servings %> 10 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/qrcode.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
物流箱
3 |
4 | <%= render 'serving' %> 5 |
6 |
7 | -------------------------------------------------------------------------------- /app/views/serve/me/servings/start.turbo_stream.erb: -------------------------------------------------------------------------------- 1 | <%= turbo_stream.append 'body' do %> 2 |
3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/serve/my/servings/_index/_serving.html+phone.erb: -------------------------------------------------------------------------------- 1 |

2 | <%= serving.item.good.name %> 3 |

4 |
5 | <% unless serving.member %> 6 |
7 | <%= image_tag serving.qrcode_enter_url %> 8 |
出示二维码核销
9 |
10 | <% end %> 11 |
12 | <%= render partial: 'serving_preview', locals: { serving: serving } %> 13 | <%= turbo_stream_from serving %> 14 | -------------------------------------------------------------------------------- /app/views/serve/my/servings/_index/_serving_preview.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | <%= serving.member&.name %> 7 | 8 |
9 |
10 | 11 | 12 | 13 | 14 |
15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /app/views/serve/my/servings/_index/_top_bar.html+phone.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= link_to({ controller: 'trade/my/orders', action: 'show', id: @item.order_id }, class: 'px-4') do %> 4 | 5 | <% end %> 6 |
<%= t('.title') %>
7 | 8 |
9 |
10 | -------------------------------------------------------------------------------- /app/views/serve/my/servings/index.html+phone.erb: -------------------------------------------------------------------------------- 1 | <%= render 'top_bar' %> 2 | 3 |
4 |
5 | <%= render partial: 'serving', collection: @servings, as: :serving %> 6 |
7 |
8 | -------------------------------------------------------------------------------- /app/views/serve/services/_base/_cart.html.erb: -------------------------------------------------------------------------------- 1 | <% item = cart.find_item(good_id: model.id) %> 2 | 3 | <%= button_to({ controller: 'trade/my/items', action: 'update', id: item.id }, method: :patch, params: { '[item]number': item.number - 1 }, class: 'mr-1', form: { data: { turbo_scroll: true, turbo_scroll_container: 'production_body' } }) do %> 4 | 5 | <% end if item && item.number > 1 %> 6 | <%= button_to({ controller: 'trade/my/items', action: 'destroy', id: item.id }, method: :delete, class: 'mr-1', form: { data: { turbo_scroll: true, turbo_scroll_container: 'production_body' } }) do %> 7 | 8 | <% end if item && item.number <= 1 %> 9 | <%= form_with(theme: nil, scope: 'item', url: { controller: 'trade/my/items', action: 'update', id: item.id }, method: :patch, data: { controller: 'input', turbo_scroll: true, turbo_scroll_container: 'production_body' }) do |f| %> 10 | <%= f.number_field :number, value: item.number, data: { action: 'change->input#form' }, class: 'has-background-light has-text-centered', style: 'width: 30px' %> 11 | <% end if item %> 12 | <%= button_to({ controller: 'trade/my/items', action: 'update', id: item.id }, method: :patch, params: { '[item]number': item.number + 1 }, class: 'ml-1', form: { data: { turbo_scroll: true, turbo_scroll_container: 'production_body' } }) do %> 13 | 14 | <% end if item %> 15 | 16 | <%= form_with theme: nil, url: { controller: 'trade/my/items' }, data: { turbo_scroll: true, turbo_scroll_container: 'production_body' }, class: 'ml-1 button_to' do |f| %> 17 | <%= f.hidden_field :current_cart_id, value: cart.id %> 18 | <%= f.hidden_field :good_type, value: model.class_name %> 19 | <%= f.hidden_field :good_id, value: model.id %> 20 | <%= button_tag do %> 21 | 22 | <% end %> 23 | <% end unless item %> 24 | -------------------------------------------------------------------------------- /app/views/serve/services/_base/_tab_bar_footer.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= link_to({ controller: 'trade/my/carts', action: 'show', id: @cart.id }, class: 'level-item mb-0') do %> 4 | 5 | <%= @cart.items.count %> 6 | 7 | <% end %> 8 |
9 | <%= @cart.item_amount.to_money.format(html_wrap: true).html_safe %> 10 |
11 |
12 |
13 |
14 | <%= link_to({ controller: 'trade/my/carts', action: 'show', id: @cart.id }, class: 'weui-btn weui-btn_mini weui-btn_primary') do %> 15 | 去购物车 16 | 17 | <% end %> 18 |
19 |
20 |
21 | -------------------------------------------------------------------------------- /app/views/serve/services/_index/_index_table.html+phone.erb: -------------------------------------------------------------------------------- 1 |
2 |
<%= t('.title') %>
3 |
4 | <%= yield %> 5 |
6 |
7 |
8 |
9 | -------------------------------------------------------------------------------- /app/views/serve/services/_index/_index_tbody.html+phone.erb: -------------------------------------------------------------------------------- 1 |
2 | <%= image_tag model.logo, class: 'image is-24x24' if model.logo.attached? %> 3 | <%= model.name %> 4 |
5 | 6 | <%= model.price.to_money.format(html_wrap: true).html_safe %> 7 | 8 | -------------------------------------------------------------------------------- /app/views/serve/services/_index/_index_tr.html+phone.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= yield %> 4 |
5 |
6 | <%= render partial: 'cart', locals: { model: model, cart: @cart } %> 7 |
8 |
9 | -------------------------------------------------------------------------------- /app/views/serve/services/index.html+phone.erb: -------------------------------------------------------------------------------- 1 | <%= render 'top_bar' %> 2 | <%= render 'filter_form' %> 3 | <%= render 'filter_table' %> 4 | 5 | <%= render layout: 'index_table' do %> 6 | <%= render partial: 'index_tbody', layout: 'index_tr', collection: @services, as: :model %> 7 | <% end %> 8 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | ENGINE_ROOT = File.expand_path('..', __dir__) 4 | ENGINE_PATH = File.expand_path('../lib/rails_serve/engine', __dir__) 5 | APP_PATH = File.expand_path('../test/dummy/config/application', __dir__) 6 | 7 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 8 | require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) 9 | 10 | require 'rails/all' 11 | require 'rails/engine/commands' 12 | -------------------------------------------------------------------------------- /config/locales/zh.attributes.yml: -------------------------------------------------------------------------------- 1 | zh: 2 | activerecord: 3 | attributes: 4 | serve/service: 5 | price: 价格 6 | serve/serving: 7 | member_id: 服务技师 8 | -------------------------------------------------------------------------------- /config/locales/zh.controller.yml: -------------------------------------------------------------------------------- 1 | zh: 2 | serve: 3 | title: 服务 4 | services: 5 | index: 6 | title: 服务项目 7 | my: 8 | servings: 9 | index: 10 | title: 服务 11 | me: 12 | title: 我的服务 13 | servings: 14 | index: 15 | title: 我的服务 16 | admin: 17 | title: 服务管理 18 | home: 19 | index: 20 | title: 服务管理 21 | services: 22 | index: 23 | title: 服务项目 24 | wallet: 25 | title: 钱包支付 26 | card: 27 | title: 会员价 28 | servers: 29 | index: 30 | title: 服务人员 31 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | scope RailsCom.default_routes_scope do 3 | namespace :serve, defaults: { business: 'serve' } do 4 | resources :services do 5 | resources :servers 6 | end 7 | resources :servings do 8 | member do 9 | get :qrcode 10 | end 11 | end 12 | namespace :admin, defaults: { namespace: 'admin' } do 13 | root 'home#index' 14 | resources :services do 15 | member do 16 | get :wallet 17 | patch :update_wallet 18 | get :card 19 | patch :update_card 20 | end 21 | resources :servers 22 | end 23 | end 24 | namespace :my, defaults: { namespace: 'my' } do 25 | resources :items, only: [] do 26 | resources :servings 27 | end 28 | end 29 | namespace :me, defaults: { namespace: 'me' } do 30 | resources :servings do 31 | member do 32 | get :qrcode 33 | patch :start 34 | patch :finish 35 | end 36 | end 37 | end 38 | end 39 | end 40 | resolve 'Serve::Service' do |service, options| 41 | [:serve, service, options] 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /lib/rails_serve.rb: -------------------------------------------------------------------------------- 1 | require 'rails_serve/engine' 2 | -------------------------------------------------------------------------------- /lib/rails_serve/engine.rb: -------------------------------------------------------------------------------- 1 | require 'rails_com' 2 | module RailsServe 3 | class Engine < ::Rails::Engine 4 | config.generators do |g| 5 | g.helper false 6 | g.resource_route false 7 | g.templates.unshift File.expand_path('lib/templates', RailsCom::Engine.root) 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/log/.keep -------------------------------------------------------------------------------- /package.gemspec: -------------------------------------------------------------------------------- 1 | Gem::Specification.new do |s| 2 | s.name = 'rails_serve' 3 | s.version = '0.0.1' 4 | s.authors = ['qinmingyuan'] 5 | s.email = ['mingyuan0715@foxmail.com'] 6 | s.homepage = 'https://github.com/work-design/rails_serve' 7 | s.summary = 'Summary of RailsServe.' 8 | s.description = 'Description of RailsServe.' 9 | s.license = 'MIT' 10 | 11 | s.files = Dir.chdir(File.expand_path(__dir__)) do 12 | Dir[ 13 | '{app,config,db,lib}/**/*', 14 | 'LICENSE', 15 | 'Rakefile', 16 | 'README.md' 17 | ] 18 | end 19 | 20 | s.add_dependency 'rails', '>= 7.0.3.1' 21 | end 22 | -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/controllers/.keep -------------------------------------------------------------------------------- /test/controllers/serve/admin/servers_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | class Serve::Admin::ServersControllerTest < ActionDispatch::IntegrationTest 3 | 4 | setup do 5 | @server = servers(:one) 6 | end 7 | 8 | test 'index ok' do 9 | get url_for(controller: 'serve/admin/servers') 10 | 11 | assert_response :success 12 | end 13 | 14 | test 'new ok' do 15 | get url_for(controller: 'serve/admin/servers') 16 | 17 | assert_response :success 18 | end 19 | 20 | test 'create ok' do 21 | assert_difference('Server.count') do 22 | post( 23 | url_for(controller: 'serve/admin/servers', action: 'create'), 24 | params: { server: { member_id: @serve_admin_server.member_id, name: @serve_admin_server.name } }, 25 | as: :turbo_stream 26 | ) 27 | end 28 | 29 | assert_response :success 30 | end 31 | 32 | test 'show ok' do 33 | get url_for(controller: 'serve/admin/servers', action: 'show', id: @server.id) 34 | 35 | assert_response :success 36 | end 37 | 38 | test 'edit ok' do 39 | get url_for(controller: 'serve/admin/servers', action: 'edit', id: @server.id) 40 | 41 | assert_response :success 42 | end 43 | 44 | test 'update ok' do 45 | patch( 46 | url_for(controller: 'serve/admin/servers', action: 'update', id: @server.id), 47 | params: { server: { member_id: @serve_admin_server.member_id, name: @serve_admin_server.name } }, 48 | as: :turbo_stream 49 | ) 50 | 51 | assert_response :success 52 | end 53 | 54 | test 'destroy ok' do 55 | assert_difference('Server.count', -1) do 56 | delete url_for(controller: 'serve/admin/servers', action: 'destroy', id: @server.id), as: :turbo_stream 57 | end 58 | 59 | assert_response :success 60 | end 61 | 62 | end 63 | -------------------------------------------------------------------------------- /test/controllers/serve/admin/services_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | class Serve::Admin::ServicesControllerTest < ActionDispatch::IntegrationTest 3 | 4 | setup do 5 | @service = services(:one) 6 | end 7 | 8 | test 'index ok' do 9 | get url_for(controller: 'serve/admin/services') 10 | 11 | assert_response :success 12 | end 13 | 14 | test 'new ok' do 15 | get url_for(controller: 'serve/admin/services') 16 | 17 | assert_response :success 18 | end 19 | 20 | test 'create ok' do 21 | assert_difference('Service.count') do 22 | post( 23 | url_for(controller: 'serve/admin/services', action: 'create'), 24 | params: { service: { name: @serve_admin_service.name, price: @serve_admin_service.price, unit: @serve_admin_service.unit, vip_price: @serve_admin_service.vip_price } }, 25 | as: :turbo_stream 26 | ) 27 | end 28 | 29 | assert_response :success 30 | end 31 | 32 | test 'show ok' do 33 | get url_for(controller: 'serve/admin/services', action: 'show', id: @service.id) 34 | 35 | assert_response :success 36 | end 37 | 38 | test 'edit ok' do 39 | get url_for(controller: 'serve/admin/services', action: 'edit', id: @service.id) 40 | 41 | assert_response :success 42 | end 43 | 44 | test 'update ok' do 45 | patch( 46 | url_for(controller: 'serve/admin/services', action: 'update', id: @service.id), 47 | params: { service: { name: @serve_admin_service.name, price: @serve_admin_service.price, unit: @serve_admin_service.unit, vip_price: @serve_admin_service.vip_price } }, 48 | as: :turbo_stream 49 | ) 50 | 51 | assert_response :success 52 | end 53 | 54 | test 'destroy ok' do 55 | assert_difference('Service.count', -1) do 56 | delete url_for(controller: 'serve/admin/services', action: 'destroy', id: @service.id), as: :turbo_stream 57 | end 58 | 59 | assert_response :success 60 | end 61 | 62 | end 63 | -------------------------------------------------------------------------------- /test/fixtures/files/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/fixtures/files/.keep -------------------------------------------------------------------------------- /test/helpers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/helpers/.keep -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/integration/.keep -------------------------------------------------------------------------------- /test/integration/navigation_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class NavigationTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/mailers/.keep -------------------------------------------------------------------------------- /test/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/work-design/rails_serve/21a7551accd43e01382309a1720c8015ca511a0f/test/models/.keep -------------------------------------------------------------------------------- /test/rails_serve_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class RailsServeTest < ActiveSupport::TestCase 4 | test "it has a version number" do 5 | assert RailsServe::VERSION 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/system/serve/admin/servers_test.rb: -------------------------------------------------------------------------------- 1 | require "application_system_test_case" 2 | 3 | class ServersTest < ApplicationSystemTestCase 4 | setup do 5 | @serve_admin_server = serve_admin_servers(:one) 6 | end 7 | 8 | test "visiting the index" do 9 | visit serve_admin_servers_url 10 | assert_selector "h1", text: "Servers" 11 | end 12 | 13 | test "should create server" do 14 | visit serve_admin_servers_url 15 | click_on "New server" 16 | 17 | fill_in "Member", with: @serve_admin_server.member_id 18 | fill_in "Name", with: @serve_admin_server.name 19 | click_on "Create Server" 20 | 21 | assert_text "Server was successfully created" 22 | click_on "Back" 23 | end 24 | 25 | test "should update Server" do 26 | visit serve_admin_server_url(@serve_admin_server) 27 | click_on "Edit this server", match: :first 28 | 29 | fill_in "Member", with: @serve_admin_server.member_id 30 | fill_in "Name", with: @serve_admin_server.name 31 | click_on "Update Server" 32 | 33 | assert_text "Server was successfully updated" 34 | click_on "Back" 35 | end 36 | 37 | test "should destroy Server" do 38 | visit serve_admin_server_url(@serve_admin_server) 39 | click_on "Destroy this server", match: :first 40 | 41 | assert_text "Server was successfully destroyed" 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /test/system/serve/admin/services_test.rb: -------------------------------------------------------------------------------- 1 | require "application_system_test_case" 2 | 3 | class ServicesTest < ApplicationSystemTestCase 4 | setup do 5 | @serve_admin_service = serve_admin_services(:one) 6 | end 7 | 8 | test "visiting the index" do 9 | visit serve_admin_services_url 10 | assert_selector "h1", text: "Services" 11 | end 12 | 13 | test "should create service" do 14 | visit serve_admin_services_url 15 | click_on "New service" 16 | 17 | fill_in "Name", with: @serve_admin_service.name 18 | fill_in "Price", with: @serve_admin_service.price 19 | fill_in "Unit", with: @serve_admin_service.unit 20 | fill_in "Vip price", with: @serve_admin_service.vip_price 21 | click_on "Create Service" 22 | 23 | assert_text "Service was successfully created" 24 | click_on "Back" 25 | end 26 | 27 | test "should update Service" do 28 | visit serve_admin_service_url(@serve_admin_service) 29 | click_on "Edit this service", match: :first 30 | 31 | fill_in "Name", with: @serve_admin_service.name 32 | fill_in "Price", with: @serve_admin_service.price 33 | fill_in "Unit", with: @serve_admin_service.unit 34 | fill_in "Vip price", with: @serve_admin_service.vip_price 35 | click_on "Update Service" 36 | 37 | assert_text "Service was successfully updated" 38 | click_on "Back" 39 | end 40 | 41 | test "should destroy Service" do 42 | visit serve_admin_service_url(@serve_admin_service) 43 | click_on "Destroy this service", match: :first 44 | 45 | assert_text "Service was successfully destroyed" 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | # Configure Rails Environment 2 | ENV["RAILS_ENV"] = "test" 3 | 4 | require_relative "../test/dummy/config/environment" 5 | ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)] 6 | require "rails/test_help" 7 | 8 | # Load fixtures from the engine 9 | if ActiveSupport::TestCase.respond_to?(:fixture_path=) 10 | ActiveSupport::TestCase.fixture_path = File.expand_path("fixtures", __dir__) 11 | ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path 12 | ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "/files" 13 | ActiveSupport::TestCase.fixtures :all 14 | end 15 | --------------------------------------------------------------------------------