eric_weixin 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +6 -1
  3. data/app/assets/javascripts/eric_weixin/application.js +1 -0
  4. data/app/assets/javascripts/eric_weixin/cms/base.js +6 -5
  5. data/app/controllers/eric_weixin/application_controller.rb +98 -0
  6. data/app/controllers/eric_weixin/cms/base_controller.rb +1 -1
  7. data/app/controllers/eric_weixin/cms/weixin/media_articles_controller.rb +73 -0
  8. data/app/controllers/eric_weixin/cms/weixin/media_news_controller.rb +175 -0
  9. data/app/controllers/eric_weixin/cms/weixin/media_resources_controller.rb +68 -0
  10. data/app/controllers/eric_weixin/wz/pays_controller.rb +15 -0
  11. data/app/controllers/eric_weixin/wz/weixin_controller.rb +2 -2
  12. data/app/helpers/eric_weixin/application_helper.rb +6 -0
  13. data/app/helpers/eric_weixin/cms/weixin/public_accounts_helper.rb +3 -3
  14. data/app/models/eric_weixin/access_token.rb +1 -0
  15. data/app/models/eric_weixin/media_article.rb +53 -0
  16. data/app/models/eric_weixin/media_article_news.rb +6 -0
  17. data/app/models/eric_weixin/media_news.rb +216 -0
  18. data/app/models/eric_weixin/media_resource.rb +172 -0
  19. data/app/models/eric_weixin/public_account.rb +9 -0
  20. data/app/views/eric_weixin/cms/weixin/media_articles/_media_article.html.erb +131 -0
  21. data/app/views/eric_weixin/cms/weixin/media_articles/_select_pic.html.erb +78 -0
  22. data/app/views/eric_weixin/cms/weixin/media_articles/edit.html.erb +4 -0
  23. data/app/views/eric_weixin/cms/weixin/media_articles/index.html.erb +31 -0
  24. data/app/views/eric_weixin/cms/weixin/media_articles/new.html.erb +15 -0
  25. data/app/views/eric_weixin/cms/weixin/media_news/_select_article.html.erb +90 -0
  26. data/app/views/eric_weixin/cms/weixin/media_news/_select_user.html.erb +8 -0
  27. data/app/views/eric_weixin/cms/weixin/media_news/_will_send_article.html.erb +53 -0
  28. data/app/views/eric_weixin/cms/weixin/media_news/new.html.erb +284 -0
  29. data/app/views/eric_weixin/cms/weixin/media_resources/_media_resource.html.erb +62 -0
  30. data/app/views/eric_weixin/cms/weixin/media_resources/edit.html.erb +20 -0
  31. data/app/views/eric_weixin/cms/weixin/media_resources/index.html.erb +49 -0
  32. data/app/views/eric_weixin/cms/weixin/media_resources/new.html.erb +4 -0
  33. data/app/views/eric_weixin/cms/weixin/url_encodes/_new.html.erb +6 -6
  34. data/app/views/eric_weixin/wz/pays/pay_fail.html.erb +2 -0
  35. data/app/views/eric_weixin/wz/pays/pay_ok.html.erb +2 -0
  36. data/app/views/eric_weixin/wz/pays/prepay.html.erb +49 -0
  37. data/app/views/layouts/eric_weixin/cms/base.html.erb +1 -1
  38. data/app/views/layouts/eric_weixin/wz/pays.html.erb +11 -0
  39. data/config/initializers/assets.rb +1 -1
  40. data/config/initializers/inflections.rb +19 -0
  41. data/config/routes.rb +20 -6
  42. data/config/tinymce.yml +11 -0
  43. data/db/migrate/20150813080541_add_mch_id_to_weixin_public_accounts.rb +5 -0
  44. data/db/migrate/20150817105643_alert_weixin_reply_message_rules_s_reply_message_length.rb +5 -0
  45. data/db/migrate/20150817143407_add_mch_key_to_weixin_public_account.rb +5 -0
  46. data/db/migrate/20150818090435_create_weixin_media_resources.rb +13 -0
  47. data/db/migrate/20150818094553_create_weixin_media_articles.rb +17 -0
  48. data/db/migrate/20150818095654_create_weixin_media_news.rb +18 -0
  49. data/db/migrate/20150818100348_create_weixin_media_articles_news.rb +11 -0
  50. data/db/migrate/20150904045253_add_host_name_to_public_account.rb +5 -0
  51. data/lib/eric_weixin.rb +2 -0
  52. data/lib/eric_weixin/modules/ip.rb +2 -0
  53. data/lib/eric_weixin/modules/pay.rb +31 -0
  54. data/lib/eric_weixin/version.rb +1 -1
  55. metadata +38 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 642edff6b9961fd9d985894da46515fe75d5aeda
4
- data.tar.gz: 43103ab6656f7a14693bb62eccec56b70dcf7a3f
3
+ metadata.gz: 2f6d9f69457b61be06879a23c862aaf030b12f8d
4
+ data.tar.gz: cbe07f22927fce38bc6d5fef9e9bf0202206d928
5
5
  SHA512:
6
- metadata.gz: e96d4c0d4d55ce60178902daf6254134bf5150451f2f0a6aab6937590fbaec591b2a3c226cfd75b3f4145382a6efb62303249201075e00177d4106c06d0ab729
7
- data.tar.gz: c39688341c2d05d8c7312d8b415d8e9466d17b6939eb0ee0a0aadb08e9c8e4b28f7361f16172ce8e27a21ee5e4ef4c805901aba15a009b6902a1e01cfa7dd4f1
6
+ metadata.gz: 91c9d6965d3414cb46467164e89bde9affc068c75d2cc4597e3b152e551e98b6897076ec2d34ec88efa80d3303be4f78194bfb673ccb9b46b3082078e149049f
7
+ data.tar.gz: bbfb01d2e6cced5b28168e27ada9ee03439ced65463bfcfba86ccf774df888c08167bc515fc4e374560ffa69b67c992e96d87b314fbd534bf47b0006f58b1487
data/README.rdoc CHANGED
@@ -21,4 +21,9 @@
21
21
 
22
22
  rake eric_weixin:install:migrations
23
23
  ===管理平台的链接
24
- *
24
+ * 二维码: /eric_weixin/cms/weixin/two_dimension_codes
25
+ * 关键字回复: /eric_weixin/cms/weixin/reply_message_rules
26
+ * 公众账号管理: /eric_weixin/cms/weixin/public_accounts
27
+ * 图文管理: /eric_weixin/cms/weixin/news_datas
28
+ * 图文素材管理: /eric_weixin/cms/weixin/article_datas
29
+ * 链接管理: /eric_weixin/cms/weixin/url_encodes
@@ -12,6 +12,7 @@
12
12
  //
13
13
  //= require_tree .
14
14
  //= require foundation
15
+ //= require tinymce-jquery
15
16
 
16
17
 
17
18
  //模式框弹出与关闭js代码
@@ -11,12 +11,13 @@
11
11
  // about supported directives.
12
12
  //= require jquery.js
13
13
  //= require jquery_ujs
14
- // require jquery-ui
14
+ //= require jquery-ui
15
15
  //= require foundation
16
16
  // require tinymce
17
17
  //= require_tree .
18
18
 
19
- //$(function(){
20
- // //$(document).foundation();
21
- // $(document).foundation('reveal', {animation: false});
22
- //});
19
+
20
+ $(function(){
21
+ //$(document).foundation();
22
+ $(document).foundation('reveal', {animation: false});
23
+ });
@@ -1,5 +1,103 @@
1
1
  module EricWeixin
2
2
  class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ require 'pp'
5
+ # helper :all # include all helpers, all the time
6
+ helper_method :current_user, :get_session_content, :get_notice_str, :get_notice_hash, :get_session_content
3
7
 
8
+ #处理控制器中的异常信息。
9
+ def dispose_exception e, error_messages={:unknow_error=>nil, :act=>nil}
10
+ case e
11
+ when BusinessException
12
+ set_notice e.to_s
13
+ return
14
+ when ActiveRecord::RecordInvalid #对于模型中的字段校验,则返回一个hash,分别是字段所对应的错误信息。
15
+ errors = {}
16
+ e.record.errors.each do |k, v|
17
+ k = k.to_s
18
+ errors[k] = v
19
+ end
20
+ set_notice errors
21
+ errors.to_logger
22
+ '.............hash'.to_logger
23
+ return
24
+ when ActiveRecord::RecordNotFound
25
+ set_notice '记录未被找到'
26
+ e.to_s.to_logger
27
+ $@.to_logger
28
+ return
29
+ else
30
+ e.to_s.to_logger
31
+ $@.to_logger
32
+ ExceptionNotifier.notify_exception(e)
33
+ raise e
34
+ set_notice error_messages[:unknow_error]||'发生未知错误'
35
+ return
36
+ end
37
+ end
38
+
39
+ def set_notice str
40
+ session[:notice] = str
41
+ end
42
+
43
+ def get_notice
44
+ str = session[:notice]
45
+ session[:notice] = nil
46
+ str
47
+ end
48
+
49
+
50
+ def get_notice_str is_all=true
51
+ if session[:notice].class == String
52
+ str = session[:notice]
53
+ session[:notice] = nil
54
+ str
55
+ end
56
+ if is_all
57
+ return str if not str.blank?
58
+ h = get_notice_hash
59
+ if h.values.length>0
60
+ return h.values[0]
61
+ end
62
+ else
63
+ return str
64
+ end
65
+ end
66
+
67
+ def get_notice_hash
68
+ if session[:notice].class == Hash
69
+ str = session[:notice]
70
+ session[:notice] = nil
71
+ str
72
+ else
73
+ Hash.new('')
74
+ end
75
+ end
76
+
77
+
78
+
79
+ def set_session_content
80
+ s = SessionContent.new(value: params.symbolize_keys.delete_if { |key, value| [:utf8, :authenticity_token].include? key }.to_s)
81
+ s.save!
82
+ s.id
83
+ end
84
+
85
+ def get_session_content id
86
+ return {} if id.blank?
87
+ begin
88
+ s = SessionContent.where(id: id, is_valid: true).first
89
+ return {} if s.blank?
90
+ s.update_attribute :is_valid, false
91
+ value = eval(s.value)
92
+ value.deep_symbolize_keys
93
+ rescue Exception => e
94
+ {}
95
+ end
96
+ end
97
+
98
+ def get_ip
99
+ ip = request.env["HTTP_X_FORWARDED_FOR"]||"127.0.0.1"
100
+ ip = begin ip.split(',')[0] rescue "127.0.0.1" end
101
+ end
4
102
  end
5
103
  end
@@ -1,4 +1,4 @@
1
- class EricWeixin::Cms::BaseController < ApplicationController
1
+ class EricWeixin::Cms::BaseController < EricWeixin::ApplicationController
2
2
  before_filter :need_login
3
3
  around_filter :round
4
4
 
@@ -0,0 +1,73 @@
1
+ class EricWeixin::Cms::Weixin::MediaArticlesController < EricWeixin::Cms::BaseController
2
+
3
+
4
+ def index
5
+ @media_articles = ::EricWeixin::MediaArticle.all.order(:id)
6
+ @media_articles = @media_articles.where("title like ?", "%#{params[:title]}%") unless params[:title].blank?
7
+ @media_articles = @media_articles.paginate(per_page: params[:per_page]||10, page: params[:page]||1)
8
+ end
9
+
10
+ def new
11
+ @media_article = ::EricWeixin::MediaArticle.new
12
+ @current_page = 1
13
+ @pics = available_pics
14
+ @total_page = (@pics.count/perpage) +1
15
+ @pics = @pics.paginate(per_page: perpage, page: 1)
16
+ end
17
+
18
+ def select_pic
19
+ @pics = available_pics
20
+ @total_page = (@pics.count/perpage) +1
21
+ @pics = @pics.paginate(per_page: perpage, page: params[:target_page].to_i)
22
+ @current_page = params[:target_page].to_i
23
+ render partial: 'select_pic'
24
+ end
25
+
26
+ def create
27
+ begin
28
+ EricWeixin::MediaArticle.create_media_article media_article_params
29
+ flash[:success] = '微信文章创建成功,再来一篇吧!'
30
+ redirect_to action: :new
31
+ rescue Exception=> e
32
+ dispose_exception e
33
+ flash[:alert] = get_notice_str
34
+ redirect_to action: :new, session_content_id: set_session_content
35
+ end
36
+ end
37
+
38
+ def edit
39
+ @media_article = ::EricWeixin::MediaArticle.find_by_id(params[:id])
40
+ @current_page = 1
41
+ @pics = available_pics
42
+ @total_page = (@pics.count/perpage) +1
43
+ end
44
+
45
+ def update
46
+ begin
47
+ media_article = EricWeixin::MediaArticle.find_by_id(params[:id])
48
+ media_article.update_media_article media_article_params
49
+ flash[:success] = '微信文章更新成功!'
50
+ redirect_to action: :index
51
+ rescue Exception=>e
52
+ dispose_exception e
53
+ flash[:alert] = get_notice_str
54
+ redirect_to "/eric_weixin/cms/weixin/media_articles/#{params[:id]}/edit?session_content_id=#{set_session_content}"
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def media_article_params
61
+ params.require(:article).permit(:tag, :thumb_media_id, :author, :title,
62
+ :digest, :show_cover_pic, :is_first_article,
63
+ :content, :content_source_url, :public_account_id)
64
+ end
65
+ def perpage
66
+ 18
67
+ end
68
+
69
+ def available_pics
70
+ ::EricWeixin::MediaResource.where(category_name: 'thumbnail').order(:id)
71
+ end
72
+
73
+ end
@@ -0,0 +1,175 @@
1
+ class EricWeixin::Cms::Weixin::MediaNewsController < EricWeixin::Cms::BaseController
2
+ def index
3
+
4
+ end
5
+
6
+ def new
7
+
8
+ end
9
+
10
+ def query_media_articles
11
+ @media_articles = ::EricWeixin::MediaArticle.common_query params.permit(:tag, :start_date, :end_date, :public_account_id)
12
+ @total_page = (@media_articles.count/4) + 1
13
+ page = params[:page] || 1
14
+ @media_articles = @media_articles.paginate(per_page: 4, page: page)
15
+ @current_page = page.to_i
16
+ render partial: 'select_article'
17
+ end
18
+
19
+ def query_weixin_users
20
+ begin
21
+ BusinessException.raise '请指定微信公众号。' if params[:public_account_id].blank?
22
+ options = {}
23
+ options[:weixin_public_account_id] = params[:public_account_id]
24
+ options[:nickname] = params[:nickname]
25
+ @weixin_users = ::EricWeixin::WeixinUser.where(weixin_public_account_id: params[:public_account_id])
26
+ @weixin_users = @weixin_users.where("nickname like ?", "%#{CGI::escape(params[:nickname])}%") unless params[:nickname].blank?
27
+ render partial: 'select_user'
28
+ rescue Exception=>e
29
+ dispose_exception e
30
+ render text: "查询失败:#{get_notice_str}"
31
+ return
32
+ end
33
+ end
34
+
35
+ def will_send_articles
36
+
37
+ articles = []
38
+ ids_msg = []
39
+
40
+ unless params[:existed_article_ids].blank?
41
+ e_ids = params[:existed_article_ids].split(',')
42
+ e_ids.each do |id|
43
+ ma = ::EricWeixin::MediaArticle.find_by_id(id)
44
+ articles << ma
45
+ ids_msg << ma.id
46
+ end
47
+ end
48
+
49
+ if params[:new_article_id].blank?
50
+ # 处理调整顺序
51
+ unless params[:up_article_id].blank?
52
+ index = ids_msg.index(params[:up_article_id].to_i)
53
+ if index==0
54
+ render text: 'top'
55
+ return
56
+ else
57
+ tmp_article = articles[index]
58
+ articles[index] = articles[index-1]
59
+ articles[index-1] = tmp_article
60
+ tmp_id = ids_msg[index]
61
+ ids_msg[index] = ids_msg[index-1]
62
+ ids_msg[index-1] = tmp_id
63
+ end
64
+ else
65
+ unless params[:down_article_id].blank?
66
+ index = ids_msg.index(params[:down_article_id].to_i)
67
+ if index==ids_msg.size-1
68
+ render text: 'bottom'
69
+ return
70
+ else
71
+ tmp_article = articles[index]
72
+ articles[index] = articles[index+1]
73
+ articles[index+1] = tmp_article
74
+ tmp_id = ids_msg[index]
75
+ ids_msg[index] = ids_msg[index+1]
76
+ ids_msg[index+1] = tmp_id
77
+ end
78
+ end
79
+ end
80
+ else
81
+ # 处理新增文章
82
+ if ids_msg.include? params[:new_article_id].to_i
83
+ # 文章已经存在
84
+ render text: 'existed'
85
+ return
86
+ else
87
+ nma = ::EricWeixin::MediaArticle.find_by_id(params[:new_article_id])
88
+ articles << nma
89
+ ids_msg << nma.id
90
+ end
91
+ end
92
+
93
+ @will_send_articles = articles
94
+ @will_send_article_msg = ids_msg.join(",")
95
+ render partial: 'will_send_article'
96
+
97
+ end
98
+
99
+ def save_news
100
+ # will_send_article_msg: will_send_article_msg,
101
+ # user_group_name: user_group_name,
102
+ # send_at_fixed_time: send_at_fixed_time,
103
+ # send_fixed_date: send_fixed_date,
104
+ # send_fixed_time: send_fixed_time,
105
+ # send_save_to_history: send_save_to_history
106
+ # public_account_id
107
+ begin
108
+ if params[:media_news_id].blank?
109
+ media_news = ::EricWeixin::MediaNews.save_news params.permit(:will_send_article_msg,:user_group_name,
110
+ :send_at_fixed_time,:send_fixed_date,
111
+ :send_fixed_time,:send_save_to_history,:public_account_id)
112
+ render text: "#{media_news.id}"
113
+ return
114
+ else
115
+ media_news = ::EricWeixin::MediaNews.find_by_id(params[:media_news_id])
116
+ media_news.update_news params.permit(:will_send_article_msg,:user_group_name,
117
+ :send_at_fixed_time,:send_fixed_date,
118
+ :send_fixed_time,:send_save_to_history,:public_account_id)
119
+ render text: "#{media_news.id}"
120
+ end
121
+ rescue Exception=>e
122
+ dispose_exception e
123
+ render text: "保存失败: #{get_notice_str}"
124
+ end
125
+ end
126
+
127
+ def preview
128
+ begin
129
+ if params[:media_news_id].blank?
130
+ media_news = ::EricWeixin::MediaNews.save_news params.permit(:will_send_article_msg,:user_group_name,
131
+ :send_at_fixed_time,:send_fixed_date,
132
+ :send_fixed_time,:send_save_to_history,:public_account_id)
133
+ media_news.preview params.permit(:preview_openid)[:preview_openid]
134
+ render text: "#{media_news.id}"
135
+ return
136
+ else
137
+ media_news = ::EricWeixin::MediaNews.find_by_id(params.permit(:media_news_id)[:media_news_id])
138
+ media_news.update_news params.permit(:will_send_article_msg,:user_group_name,
139
+ :send_at_fixed_time,:send_fixed_date,
140
+ :send_fixed_time,:send_save_to_history,:public_account_id)
141
+ media_news.preview params.permit(:preview_openid)[:preview_openid]
142
+ render text: "#{media_news.id}"
143
+ end
144
+ rescue Exception=>e
145
+ dispose_exception e
146
+ render text: "保存失败||预览失败:#{get_notice_str}"
147
+ end
148
+ end
149
+
150
+ def send_news_now
151
+ begin
152
+ if params[:media_news_id].blank?
153
+ media_news = ::EricWeixin::MediaNews.save_news params.permit(:will_send_article_msg,:user_group_name,
154
+ :send_at_fixed_time,:send_fixed_date,
155
+ :send_fixed_time,:send_save_to_history,:public_account_id)
156
+ media_news.send_to_openids
157
+ render text: "#{media_news.id}"
158
+ return
159
+ else
160
+ media_news = ::EricWeixin::MediaNews.find_by_id(params[:media_news_id])
161
+ media_news.update_news params.permit(:will_send_article_msg,:user_group_name,
162
+ :send_at_fixed_time,:send_fixed_date,
163
+ :send_fixed_time,:send_save_to_history,:public_account_id)
164
+ media_news.send_to_openids
165
+ render text: "#{media_news.id}"
166
+ end
167
+ rescue Exception=>e
168
+ dispose_exception e
169
+ render text: "保存失败||立即发送失败:#{get_notice_str}"
170
+ end
171
+ end
172
+
173
+
174
+
175
+ end
@@ -0,0 +1,68 @@
1
+ class EricWeixin::Cms::Weixin::MediaResourcesController < EricWeixin::Cms::BaseController
2
+
3
+ def index
4
+ @media_resources = ::EricWeixin::MediaResource.all.order(:id)
5
+ @media_resources = @media_resources.where("tags like ?", "%#{params[:tag]}%") unless params[:tag].blank?
6
+ @media_resources = @media_resources.where(category_name: params[:category_name]) unless params[:category_name].blank?
7
+ @media_resources = @media_resources.paginate(per_page: params[:per_page]||10, page: params[:page]||1)
8
+ end
9
+
10
+ def new
11
+ @media_resource = ::EricWeixin::MediaResource.new
12
+ end
13
+
14
+ def create
15
+ begin
16
+ p = params.require(:resource).permit(:tags, :category_name, :public_account_id)
17
+ params.permit :pic
18
+ if p[:category_name] == 'pic_in_article'
19
+ EricWeixin::MediaResource.save_pic_in_article p, params[:pic]
20
+ flash[:success] = '创建成功'
21
+ redirect_to action: :new
22
+ return
23
+ else
24
+ p[:type] = p[:category_name]
25
+ EricWeixin::MediaResource.save_media p, params[:pic]
26
+ flash[:success] = '创建成功'
27
+ redirect_to action: :new
28
+ return
29
+ end
30
+
31
+ rescue Exception=> e
32
+ dispose_exception e
33
+ flash[:alert] = get_notice_str
34
+ redirect_to action: :new, session_content_id: set_session_content
35
+ end
36
+ end
37
+
38
+ def edit
39
+ @media_resource = ::EricWeixin::MediaResource.find_by_id(params[:id])
40
+ end
41
+
42
+ def update
43
+ begin
44
+ media_resource = ::EricWeixin::MediaResource.find_by_id(params[:id])
45
+ new_tags = params.require(:resource).permit(:tags)[:tags]
46
+ media_resource.update! tags: new_tags unless new_tags.blank?
47
+ flash[:success] = "更新标签成功。"
48
+ redirect_to action: :index
49
+ rescue Exception=>e
50
+ dispose_exception e
51
+ flash[:alert] = get_notice_str
52
+ redirect_to "/eric_weixin/cms/weixin/media_resources/#{params[:id]}/edit?session_content_id=#{set_session_content}"
53
+ end
54
+ end
55
+
56
+ def destroy
57
+ begin
58
+ media_resource = ::EricWeixin::MediaResource.find_by_id(params[:id])
59
+ media_resource.delete_self
60
+ flash[:success] = '删除成功'
61
+ redirect_to action: :index
62
+ rescue Exception=>e
63
+ dispose_exception e
64
+ flash[:alert] = get_notice_str
65
+ redirect_to action: :index
66
+ end
67
+ end
68
+ end