blade-setting 0.1.8 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.idea/.rakeTasks +1 -1
- data/.idea/blade-translate.iml +0 -8
- data/.idea/workspace.xml +165 -94
- data/bin/bs +77 -17
- data/blade-setting.gemspec +1 -4
- data/lib/blade/setting.rb +128 -12
- data/lib/blade/setting/base_template.rb +882 -0
- data/lib/blade/setting/controller_template.rb +59 -0
- data/lib/blade/setting/model_template.rb +111 -0
- data/lib/blade/setting/version.rb +1 -1
- data/lib/blade/setting/yml_template.rb +34 -2
- data/reinstall.sh +4 -0
- metadata +10 -49
- data/thc-translate.png +0 -0
data/bin/bs
CHANGED
@@ -1,33 +1,93 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require_relative '../lib/blade/setting'
|
4
3
|
|
4
|
+
SCRIPT_RAILS = File.join('bin', 'rails')
|
5
5
|
require 'tty-prompt'
|
6
6
|
prompt = TTY::Prompt.new
|
7
|
-
|
8
|
-
key(:setting_path).ask('The generated config file path', default: '/app/settings')
|
7
|
+
prompt.warn('Load Rails App Env now...you may need to wait a seconds')
|
9
8
|
|
10
|
-
|
9
|
+
def in_rails_application?
|
10
|
+
File.exists?(SCRIPT_RAILS)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def ok
|
14
|
+
prompt = TTY::Prompt.new
|
15
|
+
prompt.ok("generate complete ! check files now")
|
16
|
+
exit(0);
|
17
|
+
end
|
18
|
+
|
19
|
+
if in_rails_application?
|
20
|
+
app_path = Dir.pwd + '/config/environment'
|
21
|
+
require app_path
|
22
|
+
prompt.ok('Load Rails Application ENV Success!')
|
23
|
+
else
|
24
|
+
prompt.error('You are not in Rails app root,please enter your rails app directory and run the cli tool')
|
25
|
+
exit(0);
|
26
|
+
end
|
16
27
|
|
17
|
-
|
28
|
+
require_relative '../lib/blade/setting'
|
18
29
|
|
19
|
-
|
20
|
-
|
30
|
+
menu_result = prompt.collect do
|
31
|
+
key(:menu).select('select the menu you want to do') do |menu|
|
32
|
+
menu.choice "Generate yml and setting logic files", 1
|
33
|
+
menu.choice "Generate Model's crud scaffold", 2
|
34
|
+
menu.choice "Add graphql base file to your project", 3
|
35
|
+
menu.choice "Add Base File for project [response.rb,application.json.jbuilder, application.helper, base_model_concern]", 4
|
21
36
|
end
|
22
37
|
end
|
23
38
|
|
24
|
-
|
25
|
-
|
39
|
+
case menu_result[:menu]
|
40
|
+
when 1
|
41
|
+
result = prompt.collect do
|
42
|
+
key(:setting_path).ask('The generated config file path', default: '/app/settings')
|
43
|
+
|
44
|
+
setting_choices = %w(redis sentry database influxdb scout_apm send_cloud elastic_search wechat carrierwave)
|
45
|
+
|
46
|
+
prompt.say('Please select the config file you want to generate,
|
47
|
+
(Use arrow keys, press Space to select and Enter to finish, and letter keys to filter)')
|
48
|
+
key(:configs).multi_select('check configs',
|
49
|
+
setting_choices, filter: true)
|
50
|
+
|
51
|
+
key(:yml_path).ask('The generated yml path', default: '/environments')
|
52
|
+
|
53
|
+
key(:extra_yml_path).ask('Other environment? (Input words like sit,dit,prod)', default: 'dev,sit,dit,prod') do |q|
|
54
|
+
q.convert -> (input) {input.split(/,\s*/)}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
prompt.ok('config complete')
|
59
|
+
prompt.warn("generating files ...plz don't quit")
|
26
60
|
#生成setting logic
|
27
|
-
Blade::BladeSetting.generate_setting_logic(result[:setting_path], result[:configs])
|
61
|
+
Blade::BladeSetting.generate_setting_logic(result[:setting_path], result[:configs])
|
62
|
+
|
63
|
+
prompt.warn('generating yml files ...')
|
64
|
+
Blade::BladeSetting.generate_setting_yml(result[:yml_path], result[:extra_yml_path], result[:configs])
|
65
|
+
|
66
|
+
prompt.ok("generate complete ! check files now")
|
67
|
+
|
68
|
+
when 2
|
69
|
+
model_result = prompt.collect do
|
70
|
+
key(:model_name).ask('enter the model name')
|
71
|
+
key(:namespace).ask('enter the controller namespace',default:'api')
|
72
|
+
end
|
73
|
+
ActiveRecord::Base.connection
|
74
|
+
model = Blade::BladeSetting.get_model(model_result[:model_name].classify)
|
75
|
+
if (model.blank?)
|
76
|
+
prompt.error("Model doesn't exist")
|
77
|
+
exit(0);
|
78
|
+
end
|
79
|
+
prompt.warn("generating files ...please don't quit")
|
80
|
+
Blade::BladeSetting.generate_model_template(model)
|
81
|
+
Blade::BladeSetting.generate_crud(model,model_result[:namespace])
|
82
|
+
ok();
|
83
|
+
|
84
|
+
when 3
|
85
|
+
|
86
|
+
when 4
|
87
|
+
Blade::BladeSetting.generate_base_files
|
88
|
+
ok();
|
89
|
+
|
90
|
+
end
|
28
91
|
|
29
|
-
prompt.warn('generating yml files ...')
|
30
|
-
Blade::BladeSetting.generate_setting_yml(result[:yml_path],result[:extra_yml_path], result[:configs])
|
31
92
|
|
32
|
-
prompt.ok("generate complete ! check files now")
|
33
93
|
|
data/blade-setting.gemspec
CHANGED
@@ -23,11 +23,8 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ["lib"]
|
25
25
|
|
26
|
-
spec.add_development_dependency "bundler", "
|
26
|
+
spec.add_development_dependency "bundler", ">= 1.1"
|
27
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
28
28
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
-
spec.add_dependency "rainbow" ,"~>2.1.0"
|
30
29
|
spec.add_dependency "tty-prompt", "~>0"
|
31
|
-
spec.add_dependency "activesupport", '~> 5.0'
|
32
|
-
spec.add_dependency "fileutils","~> 0.7.2"
|
33
30
|
end
|
data/lib/blade/setting.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require
|
6
|
-
require 'fileutils'
|
7
|
-
require 'blade/setting/yml_template'
|
1
|
+
require_relative '../blade/setting/yml_template'
|
2
|
+
require_relative '../blade/setting/model_template'
|
3
|
+
require_relative '../blade/setting/controller_template'
|
4
|
+
require_relative '../blade/setting/base_template'
|
5
|
+
require 'rails/generators'
|
8
6
|
module Blade
|
9
7
|
|
10
8
|
class BladeSetting
|
11
9
|
|
12
10
|
class << self
|
13
11
|
|
12
|
+
|
13
|
+
# if in_rails_application? || in_rails_application_subdirectory?
|
14
|
+
# exit(0)
|
15
|
+
# else
|
16
|
+
# exit(1)
|
17
|
+
# end
|
18
|
+
|
14
19
|
def generate_setting_logic(setting_path, configs = [])
|
15
20
|
|
16
21
|
configs.each do |config|
|
17
22
|
|
18
23
|
path = Dir.pwd
|
19
|
-
p path + setting_path
|
20
|
-
|
21
24
|
unless Dir.exist?(path + setting_path)
|
22
25
|
FileUtils.mkdir_p path + setting_path
|
23
26
|
end
|
@@ -34,11 +37,8 @@ end
|
|
34
37
|
end
|
35
38
|
|
36
39
|
def generate_setting_yml(yml_base_path, extra_path, configs = [])
|
37
|
-
|
38
40
|
all_environment_paths = extra_path
|
39
|
-
|
40
41
|
all_environment_paths.each do |env_path|
|
41
|
-
|
42
42
|
path = Dir.pwd
|
43
43
|
unless Dir.exist?(path + yml_base_path + '/' + env_path)
|
44
44
|
FileUtils.mkdir_p path + yml_base_path + '/' + env_path + '/' + 'config'
|
@@ -49,7 +49,123 @@ end
|
|
49
49
|
file.write yml_file
|
50
50
|
end
|
51
51
|
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def generate_model_template(model_class)
|
55
|
+
model_file = Blade::Setting::ModelTemplate.model_template(model_class)
|
56
|
+
path = Dir.pwd + "/app/models/" + model_class.name.downcase + ".rb"
|
57
|
+
gt = Blade::Setting::ControllerTemplate::InstallGenerator.new
|
58
|
+
file = nil
|
59
|
+
file_path = Rails.root.join('app','models',"#{model_class.name.downcase}.rb")
|
60
|
+
# if File.exist?(path)
|
61
|
+
# file = File.open(path, "w")
|
62
|
+
# else
|
63
|
+
# file = File.new(path, "w")
|
64
|
+
# end
|
65
|
+
# file.write model_file;
|
66
|
+
gt.create_view_file(file_path,model_file)
|
67
|
+
end
|
68
|
+
|
69
|
+
def generate_crud(model_class, namespace)
|
70
|
+
|
71
|
+
model = model_class.name
|
72
|
+
arg1 = model_class.name.downcase
|
73
|
+
args = arg1.pluralize
|
74
|
+
|
75
|
+
#generate routes
|
76
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.add_routes(args, namespace)
|
77
|
+
|
78
|
+
#generate controller
|
79
|
+
con_path = Rails.root.join('app', 'controllers', namespace, "#{args}_controller.rb")
|
80
|
+
con_file = Blade::Setting::ControllerTemplate::InstallGenerator.controller_tmp(model_class, namespace);
|
81
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(con_path, con_file)
|
82
|
+
|
83
|
+
|
84
|
+
#generate views
|
85
|
+
index_view_path = Rails.root.join('app', 'views', namespace, args.to_s, 'index.json.jbuilder')
|
86
|
+
common_view_path = Rails.root.join('app', 'views', namespace, 'common', "_#{arg1}.json.jbuilder")
|
87
|
+
update_view_path = Rails.root.join('app', 'views', namespace, args.to_s, 'update.json.jbuilder')
|
88
|
+
create_view_path = Rails.root.join('app', 'views', namespace, args.to_s, 'create.json.jbuilder')
|
89
|
+
delete_view_path = Rails.root.join('app', 'views', namespace, args.to_s, 'destroy.json.jbuilder')
|
90
|
+
|
91
|
+
index_content = <<-File
|
92
|
+
|
93
|
+
json.#{args} do
|
94
|
+
if @#{args}.present?
|
95
|
+
render_json_array_partial(json,@#{args},'common/#{arg1}',:#{arg1})
|
96
|
+
else
|
97
|
+
{}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
File
|
101
|
+
common_view_content = <<-File
|
102
|
+
if #{arg1}.present?
|
103
|
+
render_json_attrs(json, #{arg1})
|
104
|
+
else
|
105
|
+
json.#{arg1} {}
|
106
|
+
end
|
107
|
+
|
108
|
+
File
|
109
|
+
|
110
|
+
create_view_content = <<-File
|
111
|
+
if @#{arg1}.present?
|
112
|
+
json.#{arg1} do
|
113
|
+
render_json_attrs(json, @#{arg1})
|
114
|
+
end
|
115
|
+
else
|
116
|
+
json.#{arg1} {}
|
117
|
+
end
|
118
|
+
File
|
119
|
+
#
|
120
|
+
update_view_content = <<-File
|
121
|
+
json.#{arg1} do
|
122
|
+
if @#{arg1}.present?
|
123
|
+
render_json_attrs(json,@#{arg1})
|
124
|
+
else
|
125
|
+
{}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
File
|
130
|
+
|
131
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(index_view_path, index_content)
|
132
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(create_view_path, create_view_content)
|
133
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(update_view_path, update_view_content)
|
134
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(common_view_path, common_view_content)
|
135
|
+
Blade::Setting::ControllerTemplate::InstallGenerator.new.create_view_file(delete_view_path, '')
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
def generate_base_files
|
140
|
+
|
141
|
+
generator = Blade::Setting::ControllerTemplate::InstallGenerator.new
|
142
|
+
|
143
|
+
application_helper = Blade::Setting::BaseTemplate::APPLICATION_HELPER
|
144
|
+
application_builder = Blade::Setting::BaseTemplate::APPLICATION_JSON_BUILDER
|
145
|
+
base_model_concern = Blade::Setting::BaseTemplate::BASE_MODEL_CONCERN
|
146
|
+
response = Blade::Setting::BaseTemplate::RESPONSE
|
147
|
+
response_json = Blade::Setting::BaseTemplate::RESPONSE_JSON
|
148
|
+
|
149
|
+
application_helper_path = Rails.root.join('app', 'helpers','application_helper.rb')
|
150
|
+
application_builder_path = Rails.root.join('app', 'views', 'layouts' ,'application.json.jbuilder')
|
151
|
+
response_path = Rails.root.join('app', 'models' ,'response.rb')
|
152
|
+
base_model_concern_path = Rails.root.join('app', 'models', 'concerns', 'base_model_concern.rb')
|
153
|
+
response_json_path = Rails.root.join('app', 'views', 'common', '_response_status.json.jbuilder')
|
154
|
+
|
155
|
+
generator.create_view_file(application_builder_path, application_builder)
|
156
|
+
generator.create_view_file(application_helper_path, application_helper)
|
157
|
+
generator.create_view_file(response_path, response)
|
158
|
+
generator.create_view_file(base_model_concern_path, base_model_concern)
|
159
|
+
generator.create_view_file(response_json_path, response_json)
|
160
|
+
end
|
161
|
+
|
162
|
+
def generate_custom_yml(name)
|
163
|
+
gt = Blade::Setting::ControllerTemplate::InstallGenerator.new
|
164
|
+
end
|
165
|
+
|
52
166
|
|
167
|
+
def get_model(name)
|
168
|
+
ActiveSupport::Dependencies.constantize(name.classify)
|
53
169
|
end
|
54
170
|
|
55
171
|
end
|
@@ -0,0 +1,882 @@
|
|
1
|
+
module Blade
|
2
|
+
module Setting
|
3
|
+
|
4
|
+
module BaseTemplate
|
5
|
+
|
6
|
+
|
7
|
+
BASE_MODEL_CONCERN = <<-File
|
8
|
+
module BaseModelConcern
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
def self.get_model(model_name)
|
12
|
+
ActiveSupport::Dependencies.constantize(model_name.classify)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.params_blank?(params)
|
16
|
+
!params.select {|_k, v| v.blank?}.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def get_model(model_name)
|
21
|
+
ActiveSupport::Dependencies.constantize(model_name.classify)
|
22
|
+
end
|
23
|
+
|
24
|
+
def permit_params
|
25
|
+
name = self.model_name.singular
|
26
|
+
p = "("
|
27
|
+
self.columns.each {|c|
|
28
|
+
if (c.name != 'id')
|
29
|
+
p += ":#{'#{c.name}'},"
|
30
|
+
end}
|
31
|
+
p += ")"
|
32
|
+
puts p
|
33
|
+
return "ok"
|
34
|
+
end
|
35
|
+
|
36
|
+
def api_params
|
37
|
+
name = self.model_name.singular
|
38
|
+
self.columns.each {|c| puts "param :#{'#{' "' + name + '[' + c.name + ']" ' }'},String,desc: '#{'#{c.comment}'}' "}
|
39
|
+
return "ok"
|
40
|
+
end
|
41
|
+
|
42
|
+
# 获取字段的备注信息
|
43
|
+
# 使用 User.column_comments => hash
|
44
|
+
def column_comments
|
45
|
+
column_comments = self.connection.retrieve_column_comments(self.table_name)
|
46
|
+
column_comments
|
47
|
+
end
|
48
|
+
|
49
|
+
# 使用 User.column_comment('username') => '用户名'
|
50
|
+
def column_comment(column_name)
|
51
|
+
column_name = column_name.to_s
|
52
|
+
return '' unless self.column_names.include?(column_name)
|
53
|
+
|
54
|
+
column_comments = self.connection.retrieve_column_comments(self.table_name)
|
55
|
+
comment = column_comments[column_name.to_sym]
|
56
|
+
comment
|
57
|
+
end
|
58
|
+
|
59
|
+
# 辅助方法 将传递进来的true false 转换为 是 否
|
60
|
+
def true_change(value = '')
|
61
|
+
temp_value = value
|
62
|
+
case value
|
63
|
+
when true, 'true'
|
64
|
+
temp_value = '是'
|
65
|
+
when false, 'false'
|
66
|
+
temp_value = '否'
|
67
|
+
when 'un_pass'
|
68
|
+
temp_value = '不通过'
|
69
|
+
when 'pass'
|
70
|
+
temp_value = '通过'
|
71
|
+
when 'success'
|
72
|
+
temp_value = '成功'
|
73
|
+
when 'fail'
|
74
|
+
temp_value = '失败'
|
75
|
+
when 'change'
|
76
|
+
temp_value = '课程确认'
|
77
|
+
when 'modify'
|
78
|
+
temp_value = '未通过'
|
79
|
+
when 'file'
|
80
|
+
temp_value = '失败,需补材料'
|
81
|
+
when 'internet'
|
82
|
+
temp_value = '在线申请'
|
83
|
+
when 'paper'
|
84
|
+
temp_value = '邮件申请'
|
85
|
+
when 'other'
|
86
|
+
temp_value = '线下支付'
|
87
|
+
when 'liuyangbao'
|
88
|
+
temp_value = '留洋宝支付'
|
89
|
+
when 'provide_credit_card'
|
90
|
+
temp_value = '提供信用卡信息'
|
91
|
+
when 'provided', 'provided_cer'
|
92
|
+
temp_value = '已提供'
|
93
|
+
when 'un_provided'
|
94
|
+
temp_value = '未提供'
|
95
|
+
when '是'
|
96
|
+
temp_value = true
|
97
|
+
when '否'
|
98
|
+
temp_value = false
|
99
|
+
when 'institutional_feedback'
|
100
|
+
temp_value = '院校反馈'
|
101
|
+
when 'refusal'
|
102
|
+
temp_value = '院校拒录取'
|
103
|
+
when 'offer'
|
104
|
+
temp_value = '成功'
|
105
|
+
when 'success_enter'
|
106
|
+
temp_value = '付费注册无条件'
|
107
|
+
when 'fail_enter'
|
108
|
+
temp_value = '付费注册有条件'
|
109
|
+
end
|
110
|
+
|
111
|
+
temp_value
|
112
|
+
end
|
113
|
+
|
114
|
+
# 获取七牛上传文件的凭证
|
115
|
+
def get_upload_token
|
116
|
+
put_policy = Qiniu::Auth::PutPolicy.new(
|
117
|
+
CarrierwaveSetting.qiniu.bucket, # 存储空间
|
118
|
+
nil, # 最终资源名,可省略,即缺省为“创建”语义
|
119
|
+
1800, # 相对有效期,可省略,缺省为3600秒后 uptoken 过期
|
120
|
+
(Time.now + 30.minutes).to_i # 绝对有效期,可省略,指明 uptoken 过期期限(绝对值),通常用于调试,这里表示半小时
|
121
|
+
)
|
122
|
+
|
123
|
+
uptoken = Qiniu::Auth.generate_uptoken(put_policy) #生成凭证
|
124
|
+
bucket_domain = CarrierwaveSetting.qiniu.bucket_domain #存储空间名
|
125
|
+
|
126
|
+
return uptoken, bucket_domain
|
127
|
+
end
|
128
|
+
|
129
|
+
def es_find_by_id(id)
|
130
|
+
$elasticsearch_client.perform_request('GET', "#{'#{self.name.underscore.pluralize}/#{self.name}/#{id}'}")
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
def search_by_params(options = {})
|
135
|
+
result = self.all
|
136
|
+
if options.present?
|
137
|
+
keys = options.keys
|
138
|
+
keys.delete(:page)
|
139
|
+
keys.delete(:per)
|
140
|
+
keys.each do |key|
|
141
|
+
value = options[key]
|
142
|
+
next unless value.present? || !value.to_s.empty?
|
143
|
+
if key == :order || key == 'order'
|
144
|
+
if value.is_a?(Array)
|
145
|
+
value.each do |v|
|
146
|
+
orders = v.split(' ')
|
147
|
+
result = if orders.length == 2
|
148
|
+
result.order("#{'#{orders[0]}'} #{'#{orders[1].upcase}'}")
|
149
|
+
else
|
150
|
+
result.order(value)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
else
|
154
|
+
orders = value.split(' ')
|
155
|
+
result = if orders.length == 2
|
156
|
+
result.order("#{'#{orders[0]}'} #{'#{orders[1].upcase}'}")
|
157
|
+
else
|
158
|
+
result.order(value)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
elsif key.to_s.include?('like_')
|
162
|
+
query = ''
|
163
|
+
query_value = {}
|
164
|
+
attr_key = key.to_s.gsub('like_', '')
|
165
|
+
if attr_key.include?('.')
|
166
|
+
ref_table = attr_key.split('.')[0]
|
167
|
+
ref_key = attr_key.split('.')[1]
|
168
|
+
|
169
|
+
if value.is_a?(Array)
|
170
|
+
value.each_with_index do |v, i|
|
171
|
+
query += "upper(#{'#{attr_key}'}) like :value#{'#{i}'} "
|
172
|
+
query += 'or ' if i != value.length - 1
|
173
|
+
query_value.merge!({"value#{'#{i}'}": "%#{'#{v.upcase}'}%"})
|
174
|
+
end
|
175
|
+
result = result.where(query, query_value)
|
176
|
+
else
|
177
|
+
result = result.where("upper(#{'#{attr_key}'}) like ?", "%#{'#{value.upcase}'}%")
|
178
|
+
end
|
179
|
+
else
|
180
|
+
|
181
|
+
if value.is_a?(Array)
|
182
|
+
value.each_with_index do |v, i|
|
183
|
+
query += "#{'#{self.name.tableize}'}.#{'#{attr_key}'} like :value#{'#{i}'} "
|
184
|
+
query += 'or ' if i != value.length - 1
|
185
|
+
query_value.merge!({"value#{'#{i}'}": "%#{'#{v.upcase}'}%"})
|
186
|
+
end
|
187
|
+
result = result.where(query, query_value)
|
188
|
+
else
|
189
|
+
result = result.where("upper(#{'#{self.name.tableize}'}.#{'#{attr_key}'}) like ?", "%#{'#{value.upcase}'}%") if self.attribute_names.include?(attr_key)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# or || 兼容 'students.creator_id'的情况发生 可能传递多个,超过两个
|
194
|
+
elsif key.to_s =~ /^or_/
|
195
|
+
attr_key = key.to_s.gsub('or_', '')
|
196
|
+
values = value.split(' ')
|
197
|
+
|
198
|
+
if attr_key.include?('.')
|
199
|
+
search_key = "#{'#{attr_key}'}" if value.present?
|
200
|
+
else
|
201
|
+
search_key = "#{'#{self.name.tableize}'}.#{'#{attr_key}'}" if self.attribute_names.include?(attr_key) && value.present?
|
202
|
+
end
|
203
|
+
|
204
|
+
query_string = ''
|
205
|
+
values.each_with_index do |v, i|
|
206
|
+
query_string += "#{'#{search_key}'} = '#{'#{values[i]}'}' or "
|
207
|
+
end
|
208
|
+
query_string.chomp!(' or ')
|
209
|
+
|
210
|
+
result = result.where(query_string)
|
211
|
+
|
212
|
+
# or一个value同时搜多个参数
|
213
|
+
elsif key.to_s.include?('&or&')
|
214
|
+
# 这边的需求是搜索学校、代理、学生等的拼音名 所以需要同时搜name和name_pinyin 暂时默认是直接需要like的
|
215
|
+
# 格式: 'schools.name&or&schools.full_name'
|
216
|
+
attr_keys = key.to_s.split('&or&')
|
217
|
+
if value.present?
|
218
|
+
# query_string = ''
|
219
|
+
query_hash = {value: "%#{'#{value.upcase}'}%"}
|
220
|
+
query_string = attr_keys.map.with_index do |attr_key, i|
|
221
|
+
convert_key = if attr_key.include?('.')
|
222
|
+
attr_key
|
223
|
+
else
|
224
|
+
"#{'#{self.name.tableize}'}.#{'#{attr_key}'}" if self.attribute_names.include?(attr_key)
|
225
|
+
end
|
226
|
+
convert_key_arr = convert_key.split('.')
|
227
|
+
# 用self的话会有问题
|
228
|
+
key_type = convert_key_arr.first.classify.constantize.type_for_attribute(convert_key_arr.last).type.to_s.classify
|
229
|
+
key_type == String.name ? "upper(#{'#{convert_key}'}) like :value or " : "#{'#{convert_key}'} = :value or "
|
230
|
+
end.flatten.join[0..-5]
|
231
|
+
result = result.where(query_string, query_hash)
|
232
|
+
end
|
233
|
+
elsif key.to_s =~ /^compare_/
|
234
|
+
attr_key = key.to_s.gsub(/^compare_/, '')
|
235
|
+
if value.present?
|
236
|
+
query_hash = {}
|
237
|
+
query_string = ""
|
238
|
+
if attr_key =~ /^lt_/
|
239
|
+
attr_key.gsub!(/^lt_/, '')
|
240
|
+
convert_key = if attr_key.include?('.')
|
241
|
+
attr_key
|
242
|
+
else
|
243
|
+
"#{'#{self.name.tableize}'}.#{'#{attr_key}'}" if self.attribute_names.include?(attr_key)
|
244
|
+
end
|
245
|
+
query_hash = {value: "#{'#{value.to_d}'}"}
|
246
|
+
query_string = "#{'#{convert_key}'} <= :value "
|
247
|
+
elsif attr_key =~ /^bt_/
|
248
|
+
attr_key.gsub!(/^bt_/, '')
|
249
|
+
convert_key = if attr_key.include?('.')
|
250
|
+
attr_key
|
251
|
+
else
|
252
|
+
"#{'#{self.name.tableize}'}.#{'#{attr_key}'}" if self.attribute_names.include?(attr_key)
|
253
|
+
end
|
254
|
+
query_hash = {min: "#{'#{value.split(' ')[0]}'}", max: "#{'#{value.split(' ')[1]}'}"}
|
255
|
+
query_string = "#{'#{convert_key}'} >= :min and #{'#{convert_key}'} <= :max "
|
256
|
+
elsif attr_key =~ /^gt_/
|
257
|
+
attr_key.gsub!(/^gt_/, '')
|
258
|
+
convert_key = if attr_key.include?('.')
|
259
|
+
attr_key
|
260
|
+
else
|
261
|
+
"#{'#{self.name.tableize}'}.#{'#{attr_key}'}" if self.attribute_names.include?(attr_key)
|
262
|
+
end
|
263
|
+
query_hash = {value: "#{'#{value.to_d}'}"}
|
264
|
+
query_string = "#{'#{convert_key}'} >= :value "
|
265
|
+
end
|
266
|
+
result = result.where(query_string, query_hash)
|
267
|
+
end
|
268
|
+
#between
|
269
|
+
elsif key.to_s.include?('between_')
|
270
|
+
attr_key = key.to_s.gsub('between_', '')
|
271
|
+
front, back = value.split(',')
|
272
|
+
if attr_key.include?('.')
|
273
|
+
result = result.between_fields("#{'#{attr_key}'}", front, back) if value.present? && value.split(',').length == 2
|
274
|
+
else
|
275
|
+
puts "betewwen #{'#{front}'} #{'#{back}'}"
|
276
|
+
result = result.between_fields("#{'#{self.name.tableize}'}.#{'#{attr_key}'}", front, back) if self.attribute_names.include?(attr_key) && value.present? && value.split(',').length == 2
|
277
|
+
end
|
278
|
+
elsif key.to_s.include?('array_column_')
|
279
|
+
attr_key = key.to_s.gsub('array_column_', '')
|
280
|
+
result = result.where("#{'#{attr_key}'} && ARRAY[?]::varchar[]", value)
|
281
|
+
elsif key.to_s.include?('not_')
|
282
|
+
attr_key = key.to_s.gsub('not_', '')
|
283
|
+
result = result.where.not("#{'#{attr_key}'} = ?", "#{'#{value}'}")
|
284
|
+
else
|
285
|
+
key = key.to_s.remove('between_').remove('like_').remove('not_')
|
286
|
+
if key.include?('.')
|
287
|
+
result = result.where(key.to_sym => value)
|
288
|
+
else
|
289
|
+
result = result.where("#{'#{self.name.tableize}'}.#{'#{key}'}".to_sym => value) if self.attribute_names.include?(key)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
result
|
295
|
+
end
|
296
|
+
|
297
|
+
def resources_search_by_params(resources, options = {})
|
298
|
+
result = resources
|
299
|
+
if options.present?
|
300
|
+
keys = options.keys
|
301
|
+
keys.delete(:page)
|
302
|
+
keys.delete(:per)
|
303
|
+
keys.each do |key|
|
304
|
+
value = options[key]
|
305
|
+
next unless value.present? || !value.to_s.empty?
|
306
|
+
if key == :order || key == 'order'
|
307
|
+
orders = value.split(' ')
|
308
|
+
|
309
|
+
result = if orders.length == 2
|
310
|
+
result.order(orders[0].to_sym => orders[1].to_sym)
|
311
|
+
else
|
312
|
+
result.order(value)
|
313
|
+
end
|
314
|
+
else
|
315
|
+
result = result.where(key.to_sym => value) if result.model.instance_methods.include?(key) || result.model.attribute_names.include?(key.to_s)
|
316
|
+
if key.to_s.include?('like_')
|
317
|
+
attr_key = key.to_s.gsub('like_', '')
|
318
|
+
if attr_key.include?('.')
|
319
|
+
result = result.where("#{'#{attr_key}'} like ?", "%#{'#{value}'}%")
|
320
|
+
else
|
321
|
+
result = result.where("#{'#{result.model.name.tableize}'}.#{'#{attr_key}'} like ?", "%#{'#{value}'}%") if result.model.attribute_names.include?(attr_key)
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
result
|
328
|
+
end
|
329
|
+
|
330
|
+
def search_by_hash(args, result_objects = nil)
|
331
|
+
result = result_objects.present? ? result_objects : self.all
|
332
|
+
|
333
|
+
if args.present?
|
334
|
+
args.each_key do |key|
|
335
|
+
value = args[key]
|
336
|
+
|
337
|
+
next unless value.present? || !value.to_s.empty?
|
338
|
+
|
339
|
+
result = result.where("#{'#{self.name.tableize}'}.#{'#{key}'} like ?", "%#{'#{args[key]}'}%") if self.attribute_names.include?(key)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
result
|
344
|
+
end
|
345
|
+
|
346
|
+
def validate_present?(params)
|
347
|
+
params.select(&:present?).empty?
|
348
|
+
end
|
349
|
+
|
350
|
+
def validate_blank?(params)
|
351
|
+
return true if params.blank?
|
352
|
+
!params.select(&:blank?).empty?
|
353
|
+
end
|
354
|
+
|
355
|
+
def validate_all_present?(*args)
|
356
|
+
args.select(&:blank?).empty?
|
357
|
+
end
|
358
|
+
|
359
|
+
def validate_all_blank?(*args)
|
360
|
+
return true if args.blank?
|
361
|
+
args.select(&:present?).empty?
|
362
|
+
end
|
363
|
+
|
364
|
+
def exist_resource(resource_id)
|
365
|
+
return nil if resource_id.blank?
|
366
|
+
|
367
|
+
self.find_by_id(resource_id)
|
368
|
+
end
|
369
|
+
|
370
|
+
# 为简单的对象保存记录
|
371
|
+
# 作者 liangyuzhe 20161225
|
372
|
+
def save_values_for_object(options)
|
373
|
+
record = nil
|
374
|
+
response = Response.rescue do |_res|
|
375
|
+
column_sym = (self.columns.map(&:name) - %w(id deleted_at created_at updated_at)).map(&:to_sym)
|
376
|
+
hash = {}
|
377
|
+
column_sym.each do |c|
|
378
|
+
hash.merge!(c => options[c])
|
379
|
+
end
|
380
|
+
record = self.create!(hash)
|
381
|
+
end
|
382
|
+
[response, record]
|
383
|
+
end
|
384
|
+
|
385
|
+
# postgresql查询jsonb数据方法
|
386
|
+
# params white_list String Array
|
387
|
+
# params params ActionController::Parameters
|
388
|
+
# params jsonb_column_name string
|
389
|
+
# 作者 liangyuzhe 20170108
|
390
|
+
#
|
391
|
+
def search_by_action_controller_params_for_jsonb(params, white_list, column_name)
|
392
|
+
if white_list.present?
|
393
|
+
if white_list.is_a? String
|
394
|
+
permitted = params.permit(white_list)
|
395
|
+
elsif white_list.is_a? Array
|
396
|
+
permitted = {}
|
397
|
+
white_list.each {|w| permitted.merge!(params.permit(w)) if w.is_a? String}
|
398
|
+
end
|
399
|
+
end
|
400
|
+
if permitted.present?
|
401
|
+
find_result(permitted.to_json, column_name)
|
402
|
+
else
|
403
|
+
self.all
|
404
|
+
end
|
405
|
+
rescue => e
|
406
|
+
yloge e, '传入的数据有问题'
|
407
|
+
end
|
408
|
+
|
409
|
+
# 得到数据方法
|
410
|
+
def find_result(permitted, column_name)
|
411
|
+
query = nil
|
412
|
+
self.columns.map(&:name).each do |c|
|
413
|
+
if column_name == c
|
414
|
+
query = self.where("#{'#{column_name}'} @> :permitted", permitted: permitted)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
query
|
418
|
+
rescue => e
|
419
|
+
yloge e, '传入的数据有问题'
|
420
|
+
end
|
421
|
+
|
422
|
+
|
423
|
+
def hash_keys_to_symbol(hash)
|
424
|
+
{}.tap do |h|
|
425
|
+
hash.each {|key, value| h[key.to_sym] = map_value(value)}
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
# 为简单的对象更新记录
|
431
|
+
# 作者 liangyuzhe 20161225
|
432
|
+
def update_values_for_object(options)
|
433
|
+
record = nil
|
434
|
+
response = Response.rescue do |_res|
|
435
|
+
column_sym = (self.class.columns.map(&:name) - %w(id deleted_at created_at updated_at)).map(&:to_sym)
|
436
|
+
hash = {}
|
437
|
+
column_sym.each do |c|
|
438
|
+
hash.merge!(c => options[c]) if options[c].present?
|
439
|
+
end
|
440
|
+
record = self.update!(hash)
|
441
|
+
end
|
442
|
+
[response, record]
|
443
|
+
end
|
444
|
+
|
445
|
+
#构造查询条件
|
446
|
+
def self.build_search(options = {})
|
447
|
+
if options.present?
|
448
|
+
search_string = "where "
|
449
|
+
keys = options.keys
|
450
|
+
keys.each do |key|
|
451
|
+
value = options[key]
|
452
|
+
Rails.logger.info ">>>> build_search key: #{'#{key.to_s}'}"
|
453
|
+
Rails.logger.info ">>>> build_search value: #{'#{value.to_s}'}"
|
454
|
+
|
455
|
+
next unless (value.present? || !value.to_s.empty?) and value != "''" and !value.blank?
|
456
|
+
#模糊查询
|
457
|
+
if key.to_s.include?('like_')
|
458
|
+
attr_key = key.to_s.gsub('like_', '')
|
459
|
+
str = "#{'#{attr_key}'} like '%#{'#{value}'}%'"
|
460
|
+
|
461
|
+
#否定查询
|
462
|
+
elsif key.to_s.include?('no_')
|
463
|
+
attr_key = key.to_s.gsub('no_', '')
|
464
|
+
if attr_key == 'academic_category'
|
465
|
+
str = "#{'#{attr_key}'} != '#{'#{value.upcase}'}'"
|
466
|
+
else
|
467
|
+
str = "#{'#{attr_key}'} not like '%#{'#{value}'}%'"
|
468
|
+
end
|
469
|
+
|
470
|
+
#按日期区间查询
|
471
|
+
elsif key.to_s.include?('between_')
|
472
|
+
attr_key = key.to_s.gsub('between_', '')
|
473
|
+
date_array = value.split(',').collect {|item| item.tr('/', '-')}
|
474
|
+
str = ''
|
475
|
+
if date_array.size > 1
|
476
|
+
str = "#{'#{attr_key}'} between '#{'#{date_array[0]}'}' and '#{'#{date_array[1]}'}'"
|
477
|
+
elsif value[0].blank?
|
478
|
+
str = "#{'#{attr_key}'} <= '#{'#{date_array[0]}'}'"
|
479
|
+
elsif value[-1].blank?
|
480
|
+
str = "#{'#{attr_key}'} >= '#{'#{date_array[0]}'}'"
|
481
|
+
end
|
482
|
+
|
483
|
+
# #由于数据存在异常 用于特定的按月查询
|
484
|
+
# elsif key.to_s.include?('special_')
|
485
|
+
# attr_key = key.to_s.gsub('special_', '')
|
486
|
+
# begin_month = value.split(' ')[0]
|
487
|
+
# end_month = value.split(' ')[1]
|
488
|
+
# str = "(#{'#{attr_key}'} between '#{'#{begin_month}'}' and '#{'#{end_month}'}' or in_account_time_month between '#{'#{begin_month}'}' and '#{'#{end_month}'}')"
|
489
|
+
|
490
|
+
#由于数据存在异常 用于特定的按月查询
|
491
|
+
elsif key.to_s.include?('special_')
|
492
|
+
attr_key = key.to_s.gsub('special_', '')
|
493
|
+
date_array = value.split.collect {|item| item.tr('/', '-')}
|
494
|
+
str = ''
|
495
|
+
if date_array.size > 1
|
496
|
+
str = "(#{'#{attr_key}'} between '#{'#{date_array[0]}'}' and '#{'#{date_array[1]}'}' or in_account_time_month between '#{'#{date_array[0]}'}' and '#{'#{date_array[1]}'}')"
|
497
|
+
elsif value[0].blank?
|
498
|
+
str = "(#{'#{attr_key}'} <= '#{'#{date_array[0]}'}' or in_account_time_month <= '#{'#{date_array[0]}'}')"
|
499
|
+
elsif value[-1].blank?
|
500
|
+
str = "(#{'#{attr_key}'} >= '#{'#{date_array[0]}'}' or in_account_time_month >= '#{'#{date_array[0]}'}')"
|
501
|
+
end
|
502
|
+
|
503
|
+
elsif key.to_s.end_with?('_id')
|
504
|
+
str = ''
|
505
|
+
if value.size > 0
|
506
|
+
tmp = value.map {|item| item.to_i}.to_s
|
507
|
+
tmp.tr!('[', '(')
|
508
|
+
tmp.tr!(']', ')')
|
509
|
+
str = "#{'#{key}'} in #{'#{tmp}'}"
|
510
|
+
end
|
511
|
+
|
512
|
+
#多选模糊查询
|
513
|
+
elsif key.to_s.include?('multi_')
|
514
|
+
str = ""
|
515
|
+
attr_key = key.to_s.gsub('multi_', '')
|
516
|
+
value.each do |a|
|
517
|
+
next unless a.present?
|
518
|
+
tmp = "#{'#{attr_key}'} like '%#{'#{a}'}%'"
|
519
|
+
if a != value.first and str != ""
|
520
|
+
tmp = " or " + tmp
|
521
|
+
end
|
522
|
+
str += tmp
|
523
|
+
end
|
524
|
+
str = "(#{'#{str}'})"
|
525
|
+
else
|
526
|
+
if key == 'academic_category'
|
527
|
+
str = "#{'#{key}'} = '#{'#{value.upcase}'}'"
|
528
|
+
else
|
529
|
+
str = "#{'#{key.to_s}'}='#{'#{value}'}'"
|
530
|
+
end
|
531
|
+
end
|
532
|
+
if key != options.keys.first and search_string != "where "
|
533
|
+
str = " and " + str
|
534
|
+
end
|
535
|
+
|
536
|
+
search_string += str
|
537
|
+
end
|
538
|
+
if search_string == "where "
|
539
|
+
search_string = ""
|
540
|
+
end
|
541
|
+
# log(search_string)
|
542
|
+
return search_string
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
module AttributeType
|
547
|
+
DECIMAL = 'decimal'
|
548
|
+
STRING = 'string'
|
549
|
+
DATE = 'date'
|
550
|
+
end
|
551
|
+
|
552
|
+
def generate_pinyin_when_create
|
553
|
+
if self.deleted_at.blank?
|
554
|
+
self.class.attribute_names.each do |attribute|
|
555
|
+
self[attribute.intern] = PinYin.of_string(self[attribute.remove('_pinyin').intern]).join if attribute.include?('_pinyin')
|
556
|
+
end
|
557
|
+
end
|
558
|
+
end
|
559
|
+
|
560
|
+
end
|
561
|
+
|
562
|
+
File
|
563
|
+
# frozen_string_literal: true
|
564
|
+
|
565
|
+
|
566
|
+
APPLICATION_JSON_BUILDER = <<-File
|
567
|
+
json.partial! 'common/response_status', response: @response
|
568
|
+
page_params = {}
|
569
|
+
instance_variables.each do |iv|
|
570
|
+
begin
|
571
|
+
object = self.instance_variable_get(iv)
|
572
|
+
if object.respond_to?(:total_pages) && object.respond_to?(:total_count) && iv !=:@_config
|
573
|
+
page_params.merge!({total_pages: object.total_pages, total_count: object.total_count})
|
574
|
+
end
|
575
|
+
rescue => e
|
576
|
+
ylogi e
|
577
|
+
end
|
578
|
+
end
|
579
|
+
|
580
|
+
json.data do
|
581
|
+
json.merge! JSON.parse(yield)
|
582
|
+
if page_params.present?
|
583
|
+
json.merge! page_params
|
584
|
+
end
|
585
|
+
end
|
586
|
+
File
|
587
|
+
|
588
|
+
APPLICATION_HELPER = <<-File
|
589
|
+
# encoding: UTF-8
|
590
|
+
# frozen_string_literal: true
|
591
|
+
|
592
|
+
module ApplicationHelper
|
593
|
+
#
|
594
|
+
# 渲染json返回属性
|
595
|
+
#
|
596
|
+
# @param json [Unknown] json对象
|
597
|
+
# @param obj [ActiveRecord] 数据库表的对象
|
598
|
+
# @param attrs [Array] 需要渲染的表属性符号数组
|
599
|
+
#
|
600
|
+
def render_json_attrs(json, obj, attrs = nil)
|
601
|
+
# Rails.logger.info "obj=>#{'#{obj}'}"
|
602
|
+
if attrs.blank?
|
603
|
+
attrs = obj.class.columns.map(&:name)
|
604
|
+
end
|
605
|
+
attrs.each do |column|
|
606
|
+
next unless column != 'deleted_at'
|
607
|
+
key = column.to_sym
|
608
|
+
column_type = obj.class.columns.select { |c| c.name == column.to_s }.first.type
|
609
|
+
value = obj.__send__(column.to_sym)
|
610
|
+
if value.present?
|
611
|
+
value = value.to_time&.strftime('%F') if key.to_s == 'date' || key.to_s.include?('_date')
|
612
|
+
# 兼容代码
|
613
|
+
value = value.to_time&.strftime('%F %H:%M') if key.to_s =~ /_at$/ || key.to_s =~ /_time$/
|
614
|
+
|
615
|
+
# if (/^([a-zA-Z]+_)*id$/ =~ key).present? || key.to_s == 'whodunnit'
|
616
|
+
# if value.class == Array
|
617
|
+
# value = value.map { |v| v }
|
618
|
+
# else
|
619
|
+
# value = value
|
620
|
+
# end
|
621
|
+
# end
|
622
|
+
else
|
623
|
+
value = ''
|
624
|
+
value = false if value != true && column_type == :boolean
|
625
|
+
end
|
626
|
+
json.__send__(key, value)
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
630
|
+
def render_json_attrs_except(json, object, attrs = nil)
|
631
|
+
attrs = object.class.columns.map(&:name) - (attrs.map { |x| x.to_s }) if attrs.present?
|
632
|
+
|
633
|
+
render_json_attrs(json, object, attrs)
|
634
|
+
end
|
635
|
+
|
636
|
+
def render_json_array_partial(obj, array, particle, as)
|
637
|
+
obj.__send__('array!', array, partial: particle, as: as)
|
638
|
+
end
|
639
|
+
|
640
|
+
#
|
641
|
+
# 将准确时间转换成相对于当前的时间
|
642
|
+
#
|
643
|
+
def timeago(time)
|
644
|
+
return '' if time.blank?
|
645
|
+
|
646
|
+
if time.is_a?(String)
|
647
|
+
time = begin
|
648
|
+
Time.parse(time)
|
649
|
+
rescue
|
650
|
+
''
|
651
|
+
end
|
652
|
+
elsif time.is_a?(Time)
|
653
|
+
time = time
|
654
|
+
end
|
655
|
+
|
656
|
+
return '' if time.blank?
|
657
|
+
|
658
|
+
time_now = Time.now
|
659
|
+
|
660
|
+
interval = (time_now - time).to_i
|
661
|
+
|
662
|
+
case interval
|
663
|
+
when 0 .. 3600
|
664
|
+
minutes = interval / 60
|
665
|
+
|
666
|
+
time = I18n.t('timeago.minutes', minutes: minutes)
|
667
|
+
|
668
|
+
when 3601 .. 86_400
|
669
|
+
hours = interval / 3600
|
670
|
+
|
671
|
+
time = I18n.t('timeago.hours', hours: hours)
|
672
|
+
|
673
|
+
when 86_401 .. 2_592_000
|
674
|
+
days = interval / 86_400
|
675
|
+
|
676
|
+
time = I18n.t('timeago.days', days: days)
|
677
|
+
|
678
|
+
else
|
679
|
+
time = time.strftime('%F %H:%M')
|
680
|
+
end
|
681
|
+
|
682
|
+
time
|
683
|
+
end
|
684
|
+
|
685
|
+
def get_model(model_name)
|
686
|
+
ActiveSupport::Dependencies.constantize(model_name.classify)
|
687
|
+
end
|
688
|
+
|
689
|
+
|
690
|
+
end
|
691
|
+
File
|
692
|
+
|
693
|
+
RESPONSE = <<-File
|
694
|
+
# frozen_string_literal: true
|
695
|
+
class Response
|
696
|
+
# 添加属性
|
697
|
+
attr_accessor :code, :message, :messages
|
698
|
+
|
699
|
+
#
|
700
|
+
# 状态码
|
701
|
+
#
|
702
|
+
module Code
|
703
|
+
# 添加模型常量国际化方法
|
704
|
+
# include Dictionary::Module::I18n
|
705
|
+
|
706
|
+
################################################################################
|
707
|
+
#
|
708
|
+
# 20000 成功
|
709
|
+
#
|
710
|
+
################################################################################
|
711
|
+
|
712
|
+
SUCCESS = '20000'
|
713
|
+
|
714
|
+
################################################################################
|
715
|
+
#
|
716
|
+
# 3xxxx 数据相关
|
717
|
+
#
|
718
|
+
################################################################################
|
719
|
+
|
720
|
+
# 用户绑定第三方账户
|
721
|
+
|
722
|
+
# 第三方账户已绑定其它用户
|
723
|
+
PROVIDER_BIND_ANOTHER_USER = '30010'
|
724
|
+
|
725
|
+
################################################################################
|
726
|
+
#
|
727
|
+
# 4xxxx 业务相关
|
728
|
+
#
|
729
|
+
################################################################################
|
730
|
+
|
731
|
+
# 非法请求
|
732
|
+
INVALID_REQUEST = '40300'
|
733
|
+
|
734
|
+
# 终端密钥错误
|
735
|
+
INVALID_TERMINAL_SESSION_KEY = '40301'
|
736
|
+
|
737
|
+
# 用户密钥错误
|
738
|
+
INVALID_USER_SESSION_KEY = '40302'
|
739
|
+
|
740
|
+
# 超出请求限制数
|
741
|
+
EXCEED_REQUEST_LIMIT = '40303'
|
742
|
+
|
743
|
+
# 版本号不适配
|
744
|
+
NOT_COMPATIBLE_REVISION = '40304'
|
745
|
+
|
746
|
+
# 访问令牌过期
|
747
|
+
ACCESS_TOKEN_EXPIRED = '40305'
|
748
|
+
|
749
|
+
################################################################################
|
750
|
+
#
|
751
|
+
# 5xxxx 系统相关
|
752
|
+
#
|
753
|
+
################################################################################
|
754
|
+
|
755
|
+
# 未知错误(通常在捕捉异常后使用)
|
756
|
+
ERROR = '50000'
|
757
|
+
|
758
|
+
# 请求参数缺失
|
759
|
+
# Todo: 移动到数据相关
|
760
|
+
MISS_REQUEST_PARAMS = '50001'
|
761
|
+
|
762
|
+
# 数据处理错误
|
763
|
+
# Todo: 移动到数据相关
|
764
|
+
DATA_PROCESS_ERROR = '51000'
|
765
|
+
|
766
|
+
# 数据缺失错误
|
767
|
+
# Todo: 移动到数据相关
|
768
|
+
DATA_MISS_ERROR = '51001'
|
769
|
+
|
770
|
+
ORDER_PAYMENT_COMPLETED = '55000'
|
771
|
+
|
772
|
+
NEED_LOGIN = '40100'
|
773
|
+
|
774
|
+
# 全部
|
775
|
+
# ALL = get_all_constants.map { |constant| constant.to_s.downcase }
|
776
|
+
end
|
777
|
+
|
778
|
+
#
|
779
|
+
# 实例对象
|
780
|
+
#
|
781
|
+
# @param code [Code] 编码
|
782
|
+
# @param message [String] 返回信息
|
783
|
+
# @param messages [Array] 可能的错误信息
|
784
|
+
#
|
785
|
+
# @return [Response] 返回实例化的对象
|
786
|
+
#
|
787
|
+
def initialize(code = Code::SUCCESS, message = '', messages = [])
|
788
|
+
@code = code
|
789
|
+
@message = message
|
790
|
+
@messages = messages
|
791
|
+
end
|
792
|
+
|
793
|
+
def method_missing(method_id, *arguments, &block)
|
794
|
+
method_message = *arguments.join
|
795
|
+
if (method_id.to_s =~ /^raise_[\w]+/) == 0
|
796
|
+
error_type = method_id.to_s.split('raise_')[1].upcase!
|
797
|
+
@code = "Response::Code::#{'#{error_type}'}".constantize
|
798
|
+
@message = method_message
|
799
|
+
raise StandardError.new(method_message)
|
800
|
+
else
|
801
|
+
super
|
802
|
+
end
|
803
|
+
end
|
804
|
+
|
805
|
+
def self.rescue(catch_block = nil)
|
806
|
+
response = self.new
|
807
|
+
Rails.logger.info "response为#{'#{response.to_json}'}"
|
808
|
+
begin
|
809
|
+
yield(response)
|
810
|
+
rescue => e
|
811
|
+
if (e.class != StandardError && ENV['RAILS_ENV'] == 'development')
|
812
|
+
throw e
|
813
|
+
end
|
814
|
+
catch_block.call if catch_block.present?
|
815
|
+
if response.code == Code::SUCCESS
|
816
|
+
response.code = Code::ERROR
|
817
|
+
response.message = e.message
|
818
|
+
end
|
819
|
+
end
|
820
|
+
|
821
|
+
response
|
822
|
+
end
|
823
|
+
|
824
|
+
#
|
825
|
+
# 生成一个错误异常
|
826
|
+
#
|
827
|
+
# @example
|
828
|
+
# Response.error
|
829
|
+
# => #<Response:0x007feb7b049638 @code="50000", @message="未知异常", @messages=[]>
|
830
|
+
#
|
831
|
+
# @return [Response] 响应对象
|
832
|
+
#
|
833
|
+
def self.error message = nil
|
834
|
+
response = self.new
|
835
|
+
response.code = Code::ERROR
|
836
|
+
response.message = message || '未知异常'
|
837
|
+
|
838
|
+
response
|
839
|
+
end
|
840
|
+
|
841
|
+
# private
|
842
|
+
|
843
|
+
#
|
844
|
+
# 抛出异常
|
845
|
+
#
|
846
|
+
# @example
|
847
|
+
# Response.new.raise(Response::Code::ERROR, 'some error message')
|
848
|
+
#
|
849
|
+
# @param code [Code] 编码
|
850
|
+
# @param message [String] 信息
|
851
|
+
#
|
852
|
+
# def _raise(code, message)
|
853
|
+
# @code = code
|
854
|
+
# @message = message
|
855
|
+
#
|
856
|
+
# raise StandardError, message
|
857
|
+
# end
|
858
|
+
end
|
859
|
+
|
860
|
+
File
|
861
|
+
|
862
|
+
RESPONSE_JSON = <<-File
|
863
|
+
# frozen_string_literal: true
|
864
|
+
json.status do |res|
|
865
|
+
if response.present?
|
866
|
+
res.code response.code || Response::Code::ERROR
|
867
|
+
res.message response.message
|
868
|
+
else
|
869
|
+
res.code Response::Code::ERROR
|
870
|
+
res.message ''
|
871
|
+
end
|
872
|
+
|
873
|
+
res.no SecureRandom.uuid
|
874
|
+
end
|
875
|
+
|
876
|
+
File
|
877
|
+
|
878
|
+
end
|
879
|
+
|
880
|
+
end
|
881
|
+
|
882
|
+
end
|