weixin_pam 0.0.1
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +165 -0
- data/Rakefile +37 -0
- data/app/assets/javascripts/jquery-sortable.js +699 -0
- data/app/assets/javascripts/weixin_pam/application.js +30 -0
- data/app/assets/javascripts/weixin_pam/diymenus.js +90 -0
- data/app/assets/javascripts/weixin_pam/public_accounts.js +2 -0
- data/app/assets/javascripts/weixin_pam/user_accounts.js +23 -0
- data/app/assets/stylesheets/weixin_pam/application.scss +31 -0
- data/app/assets/stylesheets/weixin_pam/diymenus.scss +52 -0
- data/app/assets/stylesheets/weixin_pam/jquery-dragable.scss +26 -0
- data/app/assets/stylesheets/weixin_pam/public_accounts.css +4 -0
- data/app/assets/stylesheets/weixin_pam/user_accounts.css +4 -0
- data/app/controllers/weixin_pam/application_controller.rb +4 -0
- data/app/controllers/weixin_pam/diymenus_controller.rb +100 -0
- data/app/controllers/weixin_pam/public_accounts_controller.rb +62 -0
- data/app/controllers/weixin_pam/user_accounts_controller.rb +76 -0
- data/app/decorators/controllers/weixin_rails_middleware/weixin_controller_decorator.rb +31 -0
- data/app/helpers/weixin_pam/application_helper.rb +18 -0
- data/app/helpers/weixin_pam/diymenus_helper.rb +4 -0
- data/app/helpers/weixin_pam/public_accounts_helper.rb +4 -0
- data/app/helpers/weixin_pam/user_accounts_helper.rb +4 -0
- data/app/models/weixin_pam/diymenu.rb +58 -0
- data/app/models/weixin_pam/public_account.rb +87 -0
- data/app/models/weixin_pam/user_account.rb +67 -0
- data/app/views/layouts/weixin_pam/_nav_bar.html.erb +37 -0
- data/app/views/layouts/weixin_pam/application.html.erb +26 -0
- data/app/views/weixin_pam/diymenus/_form.html.erb +18 -0
- data/app/views/weixin_pam/diymenus/edit.html.erb +3 -0
- data/app/views/weixin_pam/diymenus/index.html.slim +32 -0
- data/app/views/weixin_pam/diymenus/new.html.erb +3 -0
- data/app/views/weixin_pam/public_accounts/_form.html.erb +12 -0
- data/app/views/weixin_pam/public_accounts/edit.html.erb +3 -0
- data/app/views/weixin_pam/public_accounts/index.html.erb +30 -0
- data/app/views/weixin_pam/public_accounts/new.html.erb +3 -0
- data/app/views/weixin_pam/public_accounts/show.html.erb +17 -0
- data/app/views/weixin_pam/user_accounts/_form.html.erb +37 -0
- data/app/views/weixin_pam/user_accounts/edit.html.erb +6 -0
- data/app/views/weixin_pam/user_accounts/index.html.slim +25 -0
- data/app/views/weixin_pam/user_accounts/new.html.erb +5 -0
- data/app/views/weixin_pam/user_accounts/show.html.erb +29 -0
- data/config/initializers/simple_form.rb +165 -0
- data/config/initializers/simple_form_bootstrap.rb +149 -0
- data/config/initializers/weixin_rails_middleware.rb +27 -0
- data/config/locales/diymenu.zh-CN.yml +9 -0
- data/config/locales/public_account.zh-CN.yml +16 -0
- data/config/locales/simple_form.en.yml +31 -0
- data/config/locales/user_account.zh-CN.yml +13 -0
- data/config/routes.rb +17 -0
- data/db/migrate/20151211153307_create_weixin_pam_public_accounts.rb +14 -0
- data/db/migrate/20151211153353_create_weixin_pam_user_accounts.rb +19 -0
- data/db/migrate/20151212152624_create_weixin_pam_diymenus.rb +18 -0
- data/db/migrate/20151215140830_add_weixin_secret_key_and_weixin_token_to_public_accounts.rb +13 -0
- data/db/migrate/20151218053505_add_host_to_weixin_pam_public_account.rb +6 -0
- data/lib/tasks/weixin_pam_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/lib/weixin_pam.rb +3 -0
- data/lib/weixin_pam/api_error.rb +3 -0
- data/lib/weixin_pam/api_error/failed_result.rb +11 -0
- data/lib/weixin_pam/engine.rb +24 -0
- data/lib/weixin_pam/public_account_reply.rb +222 -0
- data/lib/weixin_pam/version.rb +3 -0
- data/test/controllers/weixin_pam/diymenus_controller_test.rb +52 -0
- data/test/controllers/weixin_pam/public_accounts_controller_test.rb +52 -0
- data/test/controllers/weixin_pam/user_accounts_controller_test.rb +52 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +60 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +594 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/weixin_pam/diymenus.yml +19 -0
- data/test/fixtures/weixin_pam/public_accounts.yml +17 -0
- data/test/fixtures/weixin_pam/user_accounts.yml +15 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/models/weixin_pam/diymenu_test.rb +9 -0
- data/test/models/weixin_pam/public_account_test.rb +9 -0
- data/test/models/weixin_pam/user_account_test.rb +9 -0
- data/test/test_helper.rb +21 -0
- data/test/weixin_pam_test.rb +7 -0
- metadata +374 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// compiled file.
|
|
9
|
+
//
|
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
|
11
|
+
// about supported directives.
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
//= require jquery
|
|
15
|
+
//= require jquery_ujs
|
|
16
|
+
//= require jquery.turbolinks
|
|
17
|
+
//= require turbolinks
|
|
18
|
+
//= require bootstrap-sprockets
|
|
19
|
+
//= require ../jquery-sortable.js
|
|
20
|
+
//= require_tree .
|
|
21
|
+
|
|
22
|
+
function appendFlashMessage(type, message){
|
|
23
|
+
var el = $('<div class="alert alert-' + type + '"></div>');
|
|
24
|
+
el.append("<button class='close' data-dismiss='alert'>x</button>")
|
|
25
|
+
el.append(message);
|
|
26
|
+
el.prependTo('div#flash-message-box');
|
|
27
|
+
setTimeout(function(){
|
|
28
|
+
el.fadeOut(2000, function(){ $(this).remove() });
|
|
29
|
+
}, 5000);
|
|
30
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Place all the behaviors and hooks related to the matching controller here.
|
|
2
|
+
// All this logic will automatically be available in application.js.
|
|
3
|
+
|
|
4
|
+
$(document).ready(function(){
|
|
5
|
+
if($('body[data-page="diymenus_index"]')[0]) {
|
|
6
|
+
var formEle, sortMenuEle, sortGroup;
|
|
7
|
+
formEle = $('form#form-sort-diymenu');
|
|
8
|
+
formEle.on('ajax:success', function(data, status, xhr){
|
|
9
|
+
switch(status.action){
|
|
10
|
+
case 'upload':
|
|
11
|
+
if(status.ok)
|
|
12
|
+
appendFlashMessage('success', '上传成功');
|
|
13
|
+
else
|
|
14
|
+
appendFlashMessage('danger', '上传失败,失败原因:' + status.msg);
|
|
15
|
+
break;
|
|
16
|
+
case 'sort':
|
|
17
|
+
appendFlashMessage('success', '微信菜单保存成功');
|
|
18
|
+
break;
|
|
19
|
+
case 'download':
|
|
20
|
+
if(status.error)
|
|
21
|
+
appendFlashMessage('danger', '下载失败,失败原因:' + status.error);
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
appendFlashMessage('success', '请求成功');
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}).on('ajax:error', function(xhr, status, error){
|
|
28
|
+
appendFlashMessage('danger', '请求失败');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
function setSubMenusMargin() {
|
|
32
|
+
$('ol.sub-menus').css('margin-top', '0px');
|
|
33
|
+
$('ol.sub-menus:has("li")').css('margin-top', '10px');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function olTag() {
|
|
37
|
+
var tag = $('<ol></ol>');
|
|
38
|
+
tag.addClass('sub-menus');
|
|
39
|
+
return tag;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function addOrRemoveOl(li) {
|
|
43
|
+
if (li.find('li').length > 0) return;
|
|
44
|
+
var parent = li.parents('ol').first();
|
|
45
|
+
var hasOl = li.find('ol').length > 0;
|
|
46
|
+
if (parent.hasClass('parent-menus')) {
|
|
47
|
+
if (!hasOl) li.append(olTag());
|
|
48
|
+
li.removeData('subContainers');
|
|
49
|
+
} else if (parent.hasClass('sub-menus')) {
|
|
50
|
+
li.find('ol').remove();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
sortMenuEle = $('ol.sortMenu');
|
|
55
|
+
sortGroup = sortMenuEle.sortable({
|
|
56
|
+
clear: true,
|
|
57
|
+
group: 'menu',
|
|
58
|
+
delay: 100,
|
|
59
|
+
handle: 'i.fa.fa-arrows',
|
|
60
|
+
onDrop: function ($item, container, _super) {
|
|
61
|
+
addOrRemoveOl($item);
|
|
62
|
+
setSubMenusMargin();
|
|
63
|
+
|
|
64
|
+
var data = sortGroup.sortable("serialize").get();
|
|
65
|
+
var jsonString = JSON.stringify(data, null, ' ');
|
|
66
|
+
|
|
67
|
+
formEle.find('input[name="state"]').val(jsonString);
|
|
68
|
+
formEle.submit();
|
|
69
|
+
|
|
70
|
+
_super($item, container);
|
|
71
|
+
},
|
|
72
|
+
isValidTarget: function ($item, container) {
|
|
73
|
+
// 有3个主菜单,就不能再添加了
|
|
74
|
+
if (container.el.hasClass('parent-menus') && container.items.length >= 3)
|
|
75
|
+
return false;
|
|
76
|
+
var hasChild = $item.find('li').length > 0;
|
|
77
|
+
|
|
78
|
+
if (container.el.hasClass('sub-menus')) {
|
|
79
|
+
// 如果菜单含有子菜单,就不能移动到其他子菜单里面
|
|
80
|
+
if (hasChild) return false;
|
|
81
|
+
// 子菜单最多只能 有五个
|
|
82
|
+
if (container.items.length >= 5) return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
setSubMenusMargin();
|
|
89
|
+
}
|
|
90
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Place all the behaviors and hooks related to the matching controller here.
|
|
2
|
+
// All this logic will automatically be available in application.js.
|
|
3
|
+
$(document).ready(function(){
|
|
4
|
+
if($('body[data-page="user_accounts_index"]')[0]) {
|
|
5
|
+
console.log('user_accounts_index')
|
|
6
|
+
$(document).on('ajax:success', function(data, status, xhr){
|
|
7
|
+
console.log(status)
|
|
8
|
+
switch(status.action){
|
|
9
|
+
case 'sync_users':
|
|
10
|
+
if(status.success){
|
|
11
|
+
Turbolinks.enableTransitionCache(true);
|
|
12
|
+
Turbolinks.visit(location.href);
|
|
13
|
+
Turbolinks.enableTransitionCache(false);
|
|
14
|
+
}
|
|
15
|
+
else
|
|
16
|
+
appendFlashMessage('danger', '同步失败,失败原因:' + status.msg);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}).on('ajax:error', function(xhr, status, error){
|
|
20
|
+
appendFlashMessage('danger', '请求失败');
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
})
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
|
3
|
+
* listed below.
|
|
4
|
+
*
|
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
|
7
|
+
*
|
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
|
11
|
+
* file per style scope.
|
|
12
|
+
*
|
|
13
|
+
*= require_tree .
|
|
14
|
+
*= require_self
|
|
15
|
+
*/
|
|
16
|
+
@import "bootstrap-sprockets";
|
|
17
|
+
@import "bootstrap";
|
|
18
|
+
@import "font-awesome";
|
|
19
|
+
|
|
20
|
+
body { padding-top: 20px; padding-bottom: 20px; }
|
|
21
|
+
div#flash-message-box{
|
|
22
|
+
position: fixed;
|
|
23
|
+
top: 10px;
|
|
24
|
+
right: 10px;
|
|
25
|
+
z-index: 99999;
|
|
26
|
+
button.close[data-dismiss='alert']{
|
|
27
|
+
margin-left: 5px;
|
|
28
|
+
padding: 0px;
|
|
29
|
+
height: 1em;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Place all the styles related to the Diymenus controller here.
|
|
2
|
+
// They will automatically be included in application.css.
|
|
3
|
+
// You can use Sass (SCSS) here: http://sass-lang.com/
|
|
4
|
+
|
|
5
|
+
ol.parent-menus{
|
|
6
|
+
list-style-type: none;
|
|
7
|
+
border: 2px solid #bebebe;
|
|
8
|
+
padding: 10px;
|
|
9
|
+
> li{
|
|
10
|
+
display: block;
|
|
11
|
+
border-style: solid;
|
|
12
|
+
border-width: 1px;
|
|
13
|
+
border-color: green;
|
|
14
|
+
border-bottom-style: none;
|
|
15
|
+
background-color: #fcfff4;
|
|
16
|
+
padding: 10px;
|
|
17
|
+
i.glyphicon{
|
|
18
|
+
margin-right: 10px;
|
|
19
|
+
}
|
|
20
|
+
&.dragged {
|
|
21
|
+
border-bottom-style: solid;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
li:last-child{
|
|
25
|
+
border-bottom-style: solid;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
ol.sub-menus{
|
|
30
|
+
list-style-type: none;
|
|
31
|
+
border: 2px solid #bebebe;
|
|
32
|
+
padding: 10px;
|
|
33
|
+
margin-left: 22px;
|
|
34
|
+
> li{
|
|
35
|
+
display: block;
|
|
36
|
+
border-style: solid;
|
|
37
|
+
border-width: 1px;
|
|
38
|
+
border-color: #747474;
|
|
39
|
+
border-bottom-style: none;
|
|
40
|
+
background-color: #f6f6f6;
|
|
41
|
+
padding: 10px;
|
|
42
|
+
i.glyphicon{
|
|
43
|
+
margin-right: 10px;
|
|
44
|
+
}
|
|
45
|
+
&.dragged {
|
|
46
|
+
border-bottom-style: solid;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
li:last-child{
|
|
50
|
+
border-bottom-style: solid;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
body.dragging, body.dragging * {
|
|
2
|
+
cursor: move !important;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.dragged {
|
|
6
|
+
position: absolute;
|
|
7
|
+
opacity: 0.5;
|
|
8
|
+
z-index: 2000;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
ol li.placeholder {
|
|
12
|
+
position: relative;
|
|
13
|
+
/** More li styles **/
|
|
14
|
+
}
|
|
15
|
+
ol li.placeholder:before {
|
|
16
|
+
position: absolute;
|
|
17
|
+
content: "";
|
|
18
|
+
width: 0;
|
|
19
|
+
height: 0;
|
|
20
|
+
margin-top: -5px;
|
|
21
|
+
left: -5px;
|
|
22
|
+
top: -4px;
|
|
23
|
+
border: 5px solid transparent;
|
|
24
|
+
border-left-color: red;
|
|
25
|
+
border-right: none;
|
|
26
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require_dependency "weixin_pam/application_controller"
|
|
2
|
+
|
|
3
|
+
module WeixinPam
|
|
4
|
+
class DiymenusController < ApplicationController
|
|
5
|
+
before_action :set_public_account
|
|
6
|
+
before_action :set_diymenu, only: [:show, :edit, :update, :destroy]
|
|
7
|
+
|
|
8
|
+
# GET /diymenus
|
|
9
|
+
def index
|
|
10
|
+
@page_name = 'diymenus_index'
|
|
11
|
+
@diymenus = @public_account.diymenus
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# GET /diymenus/new
|
|
15
|
+
def new
|
|
16
|
+
@diymenu = @public_account.diymenus.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# GET /diymenus/1/edit
|
|
20
|
+
def edit
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# POST /diymenus
|
|
24
|
+
def create
|
|
25
|
+
@diymenu = @public_account.diymenus.new(diymenu_params)
|
|
26
|
+
|
|
27
|
+
if @diymenu.save
|
|
28
|
+
redirect_to public_account_diymenus_path(@public_account), notice: '菜单创建成功.'
|
|
29
|
+
else
|
|
30
|
+
render :new
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# PATCH/PUT /diymenus/1
|
|
35
|
+
def update
|
|
36
|
+
if @diymenu.update(diymenu_params)
|
|
37
|
+
flash[:notice] = '修改成功.'
|
|
38
|
+
end
|
|
39
|
+
render :edit
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# DELETE /diymenus/1
|
|
43
|
+
def destroy
|
|
44
|
+
@diymenu.destroy
|
|
45
|
+
redirect_to public_account_diymenus_path(@public_account), notice: '删除菜单成功.'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def sort
|
|
49
|
+
state = JSON.parse(params[:state])
|
|
50
|
+
enabled_menus, disabled_menus = state
|
|
51
|
+
|
|
52
|
+
save_sorted_menus enabled_menus, true
|
|
53
|
+
save_sorted_menus disabled_menus, false
|
|
54
|
+
render json: { action: :sort }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def upload
|
|
58
|
+
result = @public_account.upload_menu
|
|
59
|
+
render json: {
|
|
60
|
+
action: :upload,
|
|
61
|
+
ok: result.ok?,
|
|
62
|
+
msg: result.cn_msg
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def download
|
|
67
|
+
@public_account.download_menu!
|
|
68
|
+
flash[:notice] = '下载成功.'
|
|
69
|
+
render js: "Turbolinks.visit('#{public_account_diymenus_path(@public_account)}');"
|
|
70
|
+
rescue ApiError::FailedResult => ex
|
|
71
|
+
render json: { action: :download, error: "#{ex.message} - #{ex.result.cn_msg}" }
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
def save_sorted_menus(state, enabled)
|
|
77
|
+
Array(state).each_with_index do |parent_menu, i|
|
|
78
|
+
parent_id = parent_menu['id']
|
|
79
|
+
@public_account.diymenus.where(id: parent_id).update_all(parent_id: nil, is_show: enabled, sort: i)
|
|
80
|
+
Array(parent_menu['children']).flatten.each_with_index do |sub_menu, j|
|
|
81
|
+
@public_account.diymenus.where(id: sub_menu['id']).update_all(parent_id: parent_id, is_show: enabled, sort: j)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def set_public_account
|
|
87
|
+
@public_account = PublicAccount.find(params[:public_account_id])
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Use callbacks to share common setup or constraints between actions.
|
|
91
|
+
def set_diymenu
|
|
92
|
+
@diymenu = @public_account.diymenus.find(params[:id])
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Only allow a trusted parameter "white list" through.
|
|
96
|
+
def diymenu_params
|
|
97
|
+
params.require(:diymenu).permit(:button_type, :name, :key, :url, :is_show, :sort)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require_dependency "weixin_pam/application_controller"
|
|
2
|
+
|
|
3
|
+
module WeixinPam
|
|
4
|
+
class PublicAccountsController < ApplicationController
|
|
5
|
+
before_action :set_public_account, only: [:show, :edit, :update, :destroy]
|
|
6
|
+
|
|
7
|
+
# GET /public_accounts
|
|
8
|
+
def index
|
|
9
|
+
@public_accounts = PublicAccount.all
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# GET /public_accounts/1
|
|
13
|
+
def show
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# GET /public_accounts/new
|
|
17
|
+
def new
|
|
18
|
+
@public_account = PublicAccount.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# GET /public_accounts/1/edit
|
|
22
|
+
def edit
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# POST /public_accounts
|
|
26
|
+
def create
|
|
27
|
+
@public_account = PublicAccount.new(public_account_params)
|
|
28
|
+
|
|
29
|
+
if @public_account.save
|
|
30
|
+
redirect_to @public_account, notice: '公众号创建成功.'
|
|
31
|
+
else
|
|
32
|
+
render :new
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# PATCH/PUT /public_accounts/1
|
|
37
|
+
def update
|
|
38
|
+
if @public_account.update(public_account_params)
|
|
39
|
+
redirect_to @public_account, notice: '公众号修改成功.'
|
|
40
|
+
else
|
|
41
|
+
render :edit
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# DELETE /public_accounts/1
|
|
46
|
+
def destroy
|
|
47
|
+
@public_account.destroy
|
|
48
|
+
redirect_to public_accounts_url, notice: '成功删除公众号.'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
# Use callbacks to share common setup or constraints between actions.
|
|
53
|
+
def set_public_account
|
|
54
|
+
@public_account = PublicAccount.find(params[:id])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Only allow a trusted parameter "white list" through.
|
|
58
|
+
def public_account_params
|
|
59
|
+
params.require(:public_account).permit(:name, :app_id, :app_secret, :api_url, :api_token, :enabled, :host, :reply_class)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require_dependency "weixin_pam/application_controller"
|
|
2
|
+
|
|
3
|
+
module WeixinPam
|
|
4
|
+
class UserAccountsController < ApplicationController
|
|
5
|
+
before_action :set_public_account
|
|
6
|
+
before_action :set_user_account, only: [:show, :edit, :update, :destroy]
|
|
7
|
+
|
|
8
|
+
# GET /user_accounts
|
|
9
|
+
def index
|
|
10
|
+
@page_name = 'user_accounts_index'
|
|
11
|
+
@user_accounts = @public_account.user_accounts
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# GET /user_accounts/1
|
|
15
|
+
def show
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# GET /user_accounts/new
|
|
19
|
+
def new
|
|
20
|
+
@user_account = @public_account.user_accounts.new
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# GET /user_accounts/1/edit
|
|
24
|
+
def edit
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# POST /user_accounts
|
|
28
|
+
def create
|
|
29
|
+
@user_account = @public_account.user_accounts.new(user_account_params)
|
|
30
|
+
|
|
31
|
+
if @user_account.save
|
|
32
|
+
redirect_to @user_account, notice: 'User account was successfully created.'
|
|
33
|
+
else
|
|
34
|
+
render :new
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# PATCH/PUT /user_accounts/1
|
|
39
|
+
def update
|
|
40
|
+
if @user_account.update(user_account_params)
|
|
41
|
+
redirect_to @user_account, notice: 'User account was successfully updated.'
|
|
42
|
+
else
|
|
43
|
+
render :edit
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# DELETE /user_accounts/1
|
|
48
|
+
def destroy
|
|
49
|
+
@user_account.destroy
|
|
50
|
+
redirect_to user_accounts_url, notice: 'User account was successfully destroyed.'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def sync
|
|
54
|
+
UserAccount.sync_from_server(@public_account)
|
|
55
|
+
render json: { action: 'sync_users', success: true }
|
|
56
|
+
rescue
|
|
57
|
+
render json: { action: 'sync_users', success: false, error: $!.message }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def set_public_account
|
|
63
|
+
@public_account = PublicAccount.find(params[:public_account_id])
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Use callbacks to share common setup or constraints between actions.
|
|
67
|
+
def set_user_account
|
|
68
|
+
@user_account = @public_account.user_accounts.find(params[:id])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Only allow a trusted parameter "white list" through.
|
|
72
|
+
def user_account_params
|
|
73
|
+
params.require(:user_account).permit(:public_account_id, :uid, :nickname, :headshot, :subscribed)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|