commit
864e913f5b
@ -0,0 +1,90 @@
|
||||
$(document).on('turbolinks:load', function() {
|
||||
var $modal = $('.modal.admin-select-school-modal');
|
||||
if ($modal.length > 0) {
|
||||
var $link = null;
|
||||
var $form = $modal.find('form.admin-select-school-form');
|
||||
var multiple = $form.data('multiple');
|
||||
|
||||
$form.find('.school-select').select2({
|
||||
theme: 'bootstrap4',
|
||||
placeholder: '请选择',
|
||||
multiple: multiple,
|
||||
minimumInputLength: 1,
|
||||
ajax: {
|
||||
delay: 500,
|
||||
url: '/api/schools/search.json',
|
||||
dataType: 'json',
|
||||
data: function (params) {
|
||||
return {keyword: params.term};
|
||||
},
|
||||
processResults: function (data) {
|
||||
return {results: data.schools}
|
||||
}
|
||||
},
|
||||
templateResult: function (item) {
|
||||
if (!item.id || item.id === '') return item.text;
|
||||
var html = "<span>" + item.name + "<span class='ml-4 font-12'>";
|
||||
if(item.province){ html += item.province }
|
||||
html += "</span></span>";
|
||||
return $(html);
|
||||
},
|
||||
templateSelection: function (item) {
|
||||
if (item.id) {
|
||||
}
|
||||
return item.name || item.text;
|
||||
}
|
||||
});
|
||||
|
||||
$form.validate({
|
||||
errorElement: 'span',
|
||||
errorClass: 'danger text-danger',
|
||||
rules: {
|
||||
school_ids: {
|
||||
required: true
|
||||
}
|
||||
},
|
||||
messages: {
|
||||
school_ids: {
|
||||
required: '请选择'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$modal.on('show.bs.modal', function(event){
|
||||
$link = $(event.relatedTarget);
|
||||
});
|
||||
|
||||
$modal.on('hide.bs.modal', function(){
|
||||
$form.find('.error').html('');
|
||||
$form.find('.school-select').select2('val', ' ');
|
||||
});
|
||||
|
||||
$modal.on('click', '.submit-btn', function(){
|
||||
$form.find('.error').html('');
|
||||
|
||||
if($form.valid()){
|
||||
var url = $form.data('url');
|
||||
var schoolIds = $form.find('#school_ids').val();
|
||||
|
||||
$.ajax({
|
||||
method: 'POST',
|
||||
dataType: 'json',
|
||||
url: url,
|
||||
data: { school_ids: schoolIds },
|
||||
success: function(){
|
||||
$.notify({ message: '操作成功' });
|
||||
$modal.modal('hide');
|
||||
|
||||
setTimeout(function(){
|
||||
window.location.reload();
|
||||
}, 500);
|
||||
},
|
||||
error: function(res){
|
||||
var data = res.responseJSON;
|
||||
$form.find('.error').html(data.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
@ -0,0 +1,38 @@
|
||||
class Admins::CustomersController < Admins::BaseController
|
||||
helper_method :current_partner
|
||||
|
||||
def index
|
||||
default_sort('created_at', 'desc')
|
||||
|
||||
customers = Admins::CustomerQuery.call(params.merge(partner_id: current_partner.id))
|
||||
@customers = paginate(customers.preload(:school))
|
||||
end
|
||||
|
||||
def create
|
||||
params[:school_ids] = Array.wrap(params[:school_ids])
|
||||
school_ids = School.where(id: params[:school_ids]).pluck(:id)
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
school_ids.each do |school_id|
|
||||
next if current_partner.customers.exists?(school_id)
|
||||
|
||||
customer = Customer.create!(school_id: school_id)
|
||||
current_partner.partner_customers.create!(customer: customer)
|
||||
end
|
||||
end
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
def destroy
|
||||
current_partner.customers.find(params[:id]).destroy!
|
||||
|
||||
render_delete_success
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def current_partner
|
||||
@_current_partner ||= Partner.find(params[:partner_id])
|
||||
end
|
||||
end
|
@ -0,0 +1,29 @@
|
||||
class Admins::PartnersController < Admins::BaseController
|
||||
def index
|
||||
default_sort('created_at', 'desc')
|
||||
|
||||
partners = Admins::PartnerQuery.call(params)
|
||||
@partners = paginate(partners.preload(:school))
|
||||
end
|
||||
|
||||
def create
|
||||
params[:school_ids] = Array.wrap(params[:school_ids])
|
||||
|
||||
school_ids = School.where(id: params[:school_ids]).pluck(:id)
|
||||
exist_school_ids = Partner.where(school_id: school_ids).pluck(:school_id)
|
||||
|
||||
Partner.bulk_insert(*%i[school_id created_at updated_at]) do |worker|
|
||||
(school_ids - exist_school_ids).each do |school_id|
|
||||
worker.add(school_id: school_id)
|
||||
end
|
||||
end
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
def destroy
|
||||
Partner.find(params[:id]).destroy!
|
||||
|
||||
render_delete_success
|
||||
end
|
||||
end
|
@ -0,0 +1,24 @@
|
||||
class Admins::CustomerQuery < ApplicationQuery
|
||||
include CustomSortable
|
||||
|
||||
attr_reader :params
|
||||
|
||||
sort_columns :created_at, default_by: :created_at, default_direction: :desc, default_table: 'customers'
|
||||
|
||||
def initialize(params)
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
customers = Customer.all
|
||||
|
||||
if params[:partner_id].present?
|
||||
customers = customers.joins(:partner_customers).where(partner_customers: { partner_id: params[:partner_id] })
|
||||
end
|
||||
|
||||
keyword = params[:keyword].to_s.strip
|
||||
customers = customers.joins(:school).where('schools.name LIKE ?', "%#{keyword}%") if keyword.present?
|
||||
|
||||
custom_sort(customers, params[:sort_by], params[:sort_direction])
|
||||
end
|
||||
end
|
@ -0,0 +1,20 @@
|
||||
class Admins::PartnerQuery < ApplicationQuery
|
||||
include CustomSortable
|
||||
|
||||
attr_reader :params
|
||||
|
||||
sort_columns :created_at, default_by: :created_at, default_direction: :desc
|
||||
|
||||
def initialize(params)
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
partners = Partner.all
|
||||
|
||||
keyword = params[:keyword].to_s.strip
|
||||
partners = partners.joins(:school).where('schools.name LIKE ?', "%#{keyword}%") if keyword.present?
|
||||
|
||||
custom_sort(partners, params[:sort_by], params[:sort_direction])
|
||||
end
|
||||
end
|
@ -0,0 +1,19 @@
|
||||
<% define_admin_breadcrumbs do %>
|
||||
<% add_admin_breadcrumb('合作伙伴', admins_partners_path) %>
|
||||
<% add_admin_breadcrumb(current_partner.school&.name || current_partner.name) %>
|
||||
<% end %>
|
||||
|
||||
<div class="box search-form-container customer-list-form">
|
||||
<%= form_tag(admins_partner_customers_path(current_partner), method: :get, class: 'form-inline search-form', remote: true) do %>
|
||||
<%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-md-4 ml-3', placeholder: '客户名称检索') %>
|
||||
<%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
|
||||
<% end %>
|
||||
|
||||
<%= javascript_void_link('添加', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-select-school-modal' }) %>
|
||||
</div>
|
||||
|
||||
<div class="box customer-list-container">
|
||||
<%= render 'admins/customers/shared/list', customers: @customers %>
|
||||
</div>
|
||||
|
||||
<%= render partial: 'admins/shared/modal/select_school_modal', locals: { title: '添加客户', multiple: true, url: admins_partner_customers_path(current_partner) } %>
|
@ -0,0 +1 @@
|
||||
$('.customer-list-container').html("<%= j(render partial: 'admins/customers/shared/list', locals: { customers: @customers }) %>");
|
@ -0,0 +1,26 @@
|
||||
<table class="table table-hover text-center customer-list-table">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th width="50%" class="text-left">客户名称</th>
|
||||
<th width="30%"><%= sort_tag('添加时间', name: 'created_at', path: admins_partner_customers_path(current_partner)) %></th>
|
||||
<th width="20%">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% if customers.present? %>
|
||||
<% customers.each do |customer| %>
|
||||
<tr class="customer-item-<%= customer.id %>">
|
||||
<td class="text-left"><%= customer.school&.name %></td>
|
||||
<td><%= customer.created_at&.strftime('%Y-%m-%d %H:%M') %></td>
|
||||
<td>
|
||||
<%= delete_link '删除', admins_partner_customer_path(current_partner, customer, element: ".customer-item-#{customer.id}"), class: 'delete-customer-action' %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= render 'admins/shared/no_data_for_table' %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%= render partial: 'admins/shared/paginate', locals: { objects: customers } %>
|
@ -0,0 +1,18 @@
|
||||
<% define_admin_breadcrumbs do %>
|
||||
<% add_admin_breadcrumb('合作伙伴') %>
|
||||
<% end %>
|
||||
|
||||
<div class="box search-form-container partner-list-form">
|
||||
<%= form_tag(admins_partners_path, method: :get, class: 'form-inline search-form', remote: true) do %>
|
||||
<%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-md-4 ml-3', placeholder: '合作伙伴名称检索') %>
|
||||
<%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
|
||||
<% end %>
|
||||
|
||||
<%= javascript_void_link('添加', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-select-school-modal' }) %>
|
||||
</div>
|
||||
|
||||
<div class="box partner-list-container">
|
||||
<%= render 'admins/partners/shared/list', partners: @partners %>
|
||||
</div>
|
||||
|
||||
<%= render partial: 'admins/shared/modal/select_school_modal', locals: { title: '添加客户', multiple: true, url: admins_partners_path } %>
|
@ -0,0 +1 @@
|
||||
$('.partner-list-container').html("<%= j(render partial: 'admins/partners/shared/list', locals: { partners: @partners }) %>");
|
@ -0,0 +1,27 @@
|
||||
<table class="table table-hover text-center partner-list-table">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th width="50%" class="text-left">名称</th>
|
||||
<th width="30%"><%= sort_tag('添加时间', name: 'created_at', path: admins_partners_path) %></th>
|
||||
<th width="20%">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% if partners.present? %>
|
||||
<% partners.each do |partner| %>
|
||||
<tr class="partner-item-<%= partner.id %>">
|
||||
<td class="text-left"><%= partner.school&.name || partner.name %></td>
|
||||
<td><%= partner.created_at&.strftime('%Y-%m-%d %H:%M') %></td>
|
||||
<td>
|
||||
<%= link_to '查看', admins_partner_customers_path(partner), class: 'action' %>
|
||||
<%= delete_link '删除', admins_partner_path(partner, element: ".partner-item-#{partner.id}"), class: 'delete-partner-action' %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= render 'admins/shared/no_data_for_table' %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%= render partial: 'admins/shared/paginate', locals: { objects: partners } %>
|
@ -0,0 +1,28 @@
|
||||
<div class="modal fade admin-select-school-modal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title"><%= title %></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="admin-select-school-form" data-multiple="<%= multiple || false %>" data-url="<%= url %>">
|
||||
<div class="form-group d-flex">
|
||||
<label for="school_ids" class="col-form-label"><%= label ||= '选择单位:' %></label>
|
||||
<div class="d-flex flex-column-reverse w-75">
|
||||
<select id="school_ids" name="school_ids" class="form-control school-select" multiple="multiple"></select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="error text-danger"></div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
|
||||
<button type="button" class="btn btn-primary submit-btn">确认</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -0,0 +1,58 @@
|
||||
import React, { Component } from 'react';
|
||||
|
||||
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
|
||||
|
||||
import { Spin } from 'antd';
|
||||
import axios from 'axios';
|
||||
class Otherloginqq extends Component {
|
||||
|
||||
componentDidMount() {
|
||||
let query=this.props.location.search;
|
||||
|
||||
const type = query.split('?code=');
|
||||
const types = type[1].split('&state=');
|
||||
let codeurl = `/auth/qq/callback`;
|
||||
axios.get(codeurl,{params:{
|
||||
code:type[1],
|
||||
redirect_uri:`https://${window.location.host}/otherloginqq`
|
||||
}}).then((result)=> {
|
||||
if(result){
|
||||
if(result.data.status===0){
|
||||
if(result.data.new_user===true){
|
||||
window.location.href="/otherlogin?type=qq"
|
||||
}else{
|
||||
// this.getinfo()
|
||||
if(types[1]==="account"){
|
||||
window.location.href="/account/binding"
|
||||
}else{
|
||||
window.location.href="/"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}).catch((error)=>{
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
// Loading
|
||||
return (
|
||||
<div className="App" style={{minHeight: '800px',width:"100%"}}>
|
||||
<style>
|
||||
{
|
||||
`
|
||||
.margintop{
|
||||
margin-top:20%;
|
||||
}
|
||||
`
|
||||
}
|
||||
</style>
|
||||
<Spin size="large" className={"margintop"}/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default Otherloginqq;
|
Loading…
Reference in new issue