eric_weixin 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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