commit
6cafefe3bc
@ -1,31 +1,42 @@
|
|||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function () {
|
||||||
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-discipline-modal', function(){
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-discipline-modal', function () {
|
||||||
var $modal = $('.modal.admin-edit-discipline-modal');
|
var $modal = $('.modal.admin-edit-discipline-modal');
|
||||||
var $form = $modal.find('form.admin-edit-discipline-form');
|
var $form = $modal.find('form.admin-edit-discipline-form');
|
||||||
|
|
||||||
$form.validate({
|
$form.validate({
|
||||||
errorElement: 'span',
|
errorElement: 'span',
|
||||||
errorClass: 'danger text-danger',
|
errorClass: 'danger text-danger',
|
||||||
rules: {
|
rules: {
|
||||||
'discipline[name]': {
|
'discipline[name]': {
|
||||||
required: true,
|
required: true,
|
||||||
maxlength: 20
|
maxlength: 20
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$modal.on('click', '.submit-btn', function(){
|
$modal.on('click', '.submit-btn', submit_edit_form);
|
||||||
$form.find('.error').html('');
|
|
||||||
var url = $form.attr('action');
|
|
||||||
|
|
||||||
if ($form.valid()) {
|
$form.find("#discipline_name").keydown(function (e) {
|
||||||
$.ajax({
|
var ev = e || event;
|
||||||
method: 'PATCH',
|
var keycode = ev.which || ev.keyCode;
|
||||||
dataType: 'script',
|
if (keycode == 13) {
|
||||||
url: url,
|
submit_edit_form();
|
||||||
data: $form.serialize()
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
function submit_edit_form() {
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
@ -0,0 +1,31 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-repertoire-modal', function(){
|
||||||
|
var $modal = $('.modal.admin-edit-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-edit-repertoire-form');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
'repertoire[name]': {
|
||||||
|
required: true,
|
||||||
|
maxlength: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -1,31 +1,43 @@
|
|||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function () {
|
||||||
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-sub-discipline-modal', function(){
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-sub-discipline-modal', function () {
|
||||||
var $modal = $('.modal.admin-edit-sub-discipline-modal');
|
var $modal = $('.modal.admin-edit-sub-discipline-modal');
|
||||||
var $form = $modal.find('form.admin-edit-sub-discipline-form');
|
var $form = $modal.find('form.admin-edit-sub-discipline-form');
|
||||||
|
|
||||||
$form.validate({
|
$form.validate({
|
||||||
errorElement: 'span',
|
errorElement: 'span',
|
||||||
errorClass: 'danger text-danger',
|
errorClass: 'danger text-danger',
|
||||||
rules: {
|
rules: {
|
||||||
'sub_discipline[name]': {
|
'sub_discipline[name]': {
|
||||||
required: true,
|
required: true,
|
||||||
maxlength: 20
|
maxlength: 20
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$modal.on('click', '.submit-btn', function(){
|
$modal.on('click', '.submit-btn', submit_edit_form);
|
||||||
$form.find('.error').html('');
|
|
||||||
var url = $form.attr('action');
|
|
||||||
|
|
||||||
if ($form.valid()) {
|
$form.find("#sub_discipline_name").keydown(function (e) {
|
||||||
$.ajax({
|
var ev = e || event;
|
||||||
method: 'PATCH',
|
var keycode = ev.which || ev.keyCode;
|
||||||
dataType: 'script',
|
if (keycode == 13) {
|
||||||
url: url,
|
submit_edit_form();
|
||||||
data: $form.serialize()
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
function submit_edit_form() {
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
@ -0,0 +1,31 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-sub-repertoire-modal', function(){
|
||||||
|
var $modal = $('.modal.admin-edit-sub-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-edit-sub-repertoire-form');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
'sub_repertoire[name]': {
|
||||||
|
required: true,
|
||||||
|
maxlength: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -1,31 +1,42 @@
|
|||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function () {
|
||||||
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-tag-discipline-modal', function(){
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-tag-discipline-modal', function () {
|
||||||
var $modal = $('.modal.admin-edit-tag-discipline-modal');
|
var $modal = $('.modal.admin-edit-tag-discipline-modal');
|
||||||
var $form = $modal.find('form.admin-edit-tag-discipline-form');
|
var $form = $modal.find('form.admin-edit-tag-discipline-form');
|
||||||
|
|
||||||
$form.validate({
|
$form.validate({
|
||||||
errorElement: 'span',
|
errorElement: 'span',
|
||||||
errorClass: 'danger text-danger',
|
errorClass: 'danger text-danger',
|
||||||
rules: {
|
rules: {
|
||||||
'tag_discipline[name]': {
|
'tag_discipline[name]': {
|
||||||
required: true,
|
required: true,
|
||||||
maxlength: 20
|
maxlength: 20
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$modal.on('click', '.submit-btn', function(){
|
$modal.on('click', '.submit-btn', submit_edit_form);
|
||||||
$form.find('.error').html('');
|
|
||||||
var url = $form.attr('action');
|
|
||||||
|
|
||||||
if ($form.valid()) {
|
$form.find("#tag_discipline_name").keydown(function (e) {
|
||||||
$.ajax({
|
var ev = e || event;
|
||||||
method: 'PATCH',
|
var keycode = ev.which || ev.keyCode;
|
||||||
dataType: 'script',
|
if (keycode == 13) {
|
||||||
url: url,
|
submit_edit_form();
|
||||||
data: $form.serialize()
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
function submit_edit_form() {
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
@ -0,0 +1,31 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
$('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-tag-repertoire-modal', function(){
|
||||||
|
var $modal = $('.modal.admin-edit-tag-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-edit-tag-repertoire-form');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
'tag_repertoire[name]': {
|
||||||
|
required: true,
|
||||||
|
maxlength: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
var url = $form.attr('action');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
$.ajax({
|
||||||
|
method: 'PATCH',
|
||||||
|
dataType: 'script',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,65 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
if ($('body.admins-repertoires-index-page').length > 0) {
|
||||||
|
|
||||||
|
// ============== 新建 ===============
|
||||||
|
var $modal = $('.modal.admin-create-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-create-repertoire-form');
|
||||||
|
var $nameInput = $form.find('input[name="name"]');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
name: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// modal ready fire
|
||||||
|
$modal.on('show.bs.modal', function () {
|
||||||
|
$nameInput.val('');
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
var url = $form.data('url');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'POST',
|
||||||
|
dataType: 'json',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize(),
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".repertoire-list-container").on("change", '.repertoire-source-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/repertoires/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType:'script',
|
||||||
|
data: json
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -1,65 +1,76 @@
|
|||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function () {
|
||||||
if ($('body.admins-sub-disciplines-index-page').length > 0) {
|
if ($('body.admins-sub-disciplines-index-page').length > 0) {
|
||||||
|
|
||||||
// ============== 新建 ===============
|
// ============== 新建 ===============
|
||||||
var $modal = $('.modal.admin-create-sub-discipline-modal');
|
var $modal = $('.modal.admin-create-sub-discipline-modal');
|
||||||
var $form = $modal.find('form.admin-create-sub-discipline-form');
|
var $form = $modal.find('form.admin-create-sub-discipline-form');
|
||||||
var $nameInput = $form.find('input[name="name"]');
|
var $nameInput = $form.find('input[name="name"]');
|
||||||
|
|
||||||
$form.validate({
|
$form.validate({
|
||||||
errorElement: 'span',
|
errorElement: 'span',
|
||||||
errorClass: 'danger text-danger',
|
errorClass: 'danger text-danger',
|
||||||
rules: {
|
rules: {
|
||||||
name: {
|
name: {
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// modal ready fire
|
// modal ready fire
|
||||||
$modal.on('show.bs.modal', function () {
|
$modal.on('show.bs.modal', function () {
|
||||||
$nameInput.val('');
|
$nameInput.val('');
|
||||||
});
|
});
|
||||||
|
|
||||||
$modal.on('click', '.submit-btn', function(){
|
$modal.on('click', '.submit-btn', submit_create_form);
|
||||||
$form.find('.error').html('');
|
|
||||||
|
|
||||||
if ($form.valid()) {
|
$nameInput.keydown(function (e) {
|
||||||
var url = $form.data('url');
|
var ev = e || event;
|
||||||
|
var keycode = ev.which || ev.keyCode;
|
||||||
|
if (keycode == 13) {
|
||||||
|
submit_create_form();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$.ajax({
|
function submit_create_form() {
|
||||||
method: 'POST',
|
$form.find('.error').html('');
|
||||||
dataType: 'json',
|
|
||||||
url: url,
|
|
||||||
data: $form.serialize(),
|
|
||||||
success: function(){
|
|
||||||
$.notify({ message: '创建成功' });
|
|
||||||
$modal.modal('hide');
|
|
||||||
|
|
||||||
setTimeout(function(){
|
if ($form.valid()) {
|
||||||
window.location.reload();
|
var url = $form.data('url');
|
||||||
}, 500);
|
|
||||||
},
|
|
||||||
error: function(res){
|
|
||||||
var data = res.responseJSON;
|
|
||||||
$form.find('.error').html(data.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".sub-discipline-list-container").on("change", '.sub-discipline-source-form', function () {
|
$.ajax({
|
||||||
var s_id = $(this).attr("data-id");
|
method: 'POST',
|
||||||
var s_value = $(this).val();
|
dataType: 'json',
|
||||||
var s_name = $(this).attr("name");
|
url: url,
|
||||||
var json = {};
|
data: $form.serialize(),
|
||||||
json[s_name] = s_value;
|
success: function () {
|
||||||
$.ajax({
|
$.notify({message: '创建成功'});
|
||||||
url: "/admins/sub_disciplines/" + s_id,
|
$modal.modal('hide');
|
||||||
type: "PUT",
|
|
||||||
dataType:'script',
|
setTimeout(function () {
|
||||||
data: json
|
window.location.reload();
|
||||||
});
|
}, 500);
|
||||||
});
|
},
|
||||||
}
|
error: function (res) {
|
||||||
|
var data = res.responseJSON;
|
||||||
|
$form.find('.error').html(data.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(".sub-discipline-list-container").on("change", '.sub-discipline-source-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/sub_disciplines/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType: 'script',
|
||||||
|
data: json
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
@ -0,0 +1,65 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
if ($('body.admins-sub-repertoires-index-page').length > 0) {
|
||||||
|
|
||||||
|
// ============== 新建 ===============
|
||||||
|
var $modal = $('.modal.admin-create-sub-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-create-sub-repertoire-form');
|
||||||
|
var $nameInput = $form.find('input[name="name"]');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
name: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// modal ready fire
|
||||||
|
$modal.on('show.bs.modal', function () {
|
||||||
|
$nameInput.val('');
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
var url = $form.data('url');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'POST',
|
||||||
|
dataType: 'json',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize(),
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".sub-repertoire-list-container").on("change", '.sub-repertoire-source-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/sub_repertoires/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType:'script',
|
||||||
|
data: json
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -0,0 +1,71 @@
|
|||||||
|
$(document).on('turbolinks:load', function () {
|
||||||
|
if ($('body.admins-subject-settings-index-page').length > 0) {
|
||||||
|
var $form = $('.subject-setting-list-form');
|
||||||
|
|
||||||
|
// ************** 学校选择 *************
|
||||||
|
$form.find('.school-select').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
placeholder: '请选择创建者单位',
|
||||||
|
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;
|
||||||
|
return item.name;
|
||||||
|
},
|
||||||
|
templateSelection: function (item) {
|
||||||
|
if (item.id) {
|
||||||
|
}
|
||||||
|
return item.name || item.text;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".subject-setting-list-container").on("change", '.subject-setting-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/subject_settings/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType:'script',
|
||||||
|
data: json
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// 清空
|
||||||
|
$form.on('click', '.clear-btn', function () {
|
||||||
|
$form.find('select[name="status"]').val('');
|
||||||
|
$form.find('.school-select').val('').trigger('change');
|
||||||
|
$form.find('input[name="keyword"]').val('');
|
||||||
|
$form.find('#homepage_show').attr('checked', false);
|
||||||
|
$form.find('#excellent').attr('checked', false);
|
||||||
|
$form.find('input[type="submit"]').trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 上传图片
|
||||||
|
$('.modal.admin-upload-file-modal').on('upload:success', function (e, data) {
|
||||||
|
if(data.suffix == '_qrcode'){
|
||||||
|
var $imageElement = $('.subject-weapp-image-' + data.source_id);
|
||||||
|
$imageElement.attr('src', data.url);
|
||||||
|
$imageElement.show();
|
||||||
|
$imageElement.next().html('重新上传');
|
||||||
|
} else {
|
||||||
|
var $imageElement = $('.subject-image-' + data.source_id);
|
||||||
|
$imageElement.attr('src', data.url);
|
||||||
|
$imageElement.show();
|
||||||
|
$imageElement.next().html('重新上传');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -1,65 +1,76 @@
|
|||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function () {
|
||||||
if ($('body.admins-tag-disciplines-index-page').length > 0) {
|
if ($('body.admins-tag-disciplines-index-page').length > 0) {
|
||||||
|
|
||||||
// ============== 新建 ===============
|
// ============== 新建 ===============
|
||||||
var $modal = $('.modal.admin-create-tag-discipline-modal');
|
var $modal = $('.modal.admin-create-tag-discipline-modal');
|
||||||
var $form = $modal.find('form.admin-create-tag-discipline-form');
|
var $form = $modal.find('form.admin-create-tag-discipline-form');
|
||||||
var $nameInput = $form.find('input[name="name"]');
|
var $nameInput = $form.find('input[name="name"]');
|
||||||
|
|
||||||
$form.validate({
|
$form.validate({
|
||||||
errorElement: 'span',
|
errorElement: 'span',
|
||||||
errorClass: 'danger text-danger',
|
errorClass: 'danger text-danger',
|
||||||
rules: {
|
rules: {
|
||||||
name: {
|
name: {
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// modal ready fire
|
// modal ready fire
|
||||||
$modal.on('show.bs.modal', function () {
|
$modal.on('show.bs.modal', function () {
|
||||||
$nameInput.val('');
|
$nameInput.val('');
|
||||||
});
|
});
|
||||||
|
|
||||||
$modal.on('click', '.submit-btn', function(){
|
$modal.on('click', '.submit-btn', submit_create_form);
|
||||||
$form.find('.error').html('');
|
|
||||||
|
|
||||||
if ($form.valid()) {
|
$nameInput.keydown(function (e) {
|
||||||
var url = $form.data('url');
|
var ev = e || event;
|
||||||
|
var keycode = ev.which || ev.keyCode;
|
||||||
|
if (keycode == 13) {
|
||||||
|
submit_create_form();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$.ajax({
|
function submit_create_form() {
|
||||||
method: 'POST',
|
$form.find('.error').html('');
|
||||||
dataType: 'json',
|
|
||||||
url: url,
|
|
||||||
data: $form.serialize(),
|
|
||||||
success: function(){
|
|
||||||
$.notify({ message: '创建成功' });
|
|
||||||
$modal.modal('hide');
|
|
||||||
|
|
||||||
setTimeout(function(){
|
if ($form.valid()) {
|
||||||
window.location.reload();
|
var url = $form.data('url');
|
||||||
}, 500);
|
|
||||||
},
|
|
||||||
error: function(res){
|
|
||||||
var data = res.responseJSON;
|
|
||||||
$form.find('.error').html(data.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".tag-discipline-list-container").on("change", '.tag-discipline-source-form', function () {
|
$.ajax({
|
||||||
var s_id = $(this).attr("data-id");
|
method: 'POST',
|
||||||
var s_value = $(this).val();
|
dataType: 'json',
|
||||||
var s_name = $(this).attr("name");
|
url: url,
|
||||||
var json = {};
|
data: $form.serialize(),
|
||||||
json[s_name] = s_value;
|
success: function () {
|
||||||
$.ajax({
|
$.notify({message: '创建成功'});
|
||||||
url: "/admins/tag_disciplines/" + s_id,
|
$modal.modal('hide');
|
||||||
type: "PUT",
|
|
||||||
dataType:'script',
|
setTimeout(function () {
|
||||||
data: json
|
window.location.reload();
|
||||||
});
|
}, 500);
|
||||||
});
|
},
|
||||||
}
|
error: function (res) {
|
||||||
|
var data = res.responseJSON;
|
||||||
|
$form.find('.error').html(data.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(".tag-discipline-list-container").on("change", '.tag-discipline-source-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/tag_disciplines/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType: 'script',
|
||||||
|
data: json
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
@ -0,0 +1,65 @@
|
|||||||
|
$(document).on('turbolinks:load', function() {
|
||||||
|
if ($('body.admins-tag-repertoires-index-page').length > 0) {
|
||||||
|
|
||||||
|
// ============== 新建 ===============
|
||||||
|
var $modal = $('.modal.admin-create-tag-repertoire-modal');
|
||||||
|
var $form = $modal.find('form.admin-create-tag-repertoire-form');
|
||||||
|
var $nameInput = $form.find('input[name="name"]');
|
||||||
|
|
||||||
|
$form.validate({
|
||||||
|
errorElement: 'span',
|
||||||
|
errorClass: 'danger text-danger',
|
||||||
|
rules: {
|
||||||
|
name: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// modal ready fire
|
||||||
|
$modal.on('show.bs.modal', function () {
|
||||||
|
$nameInput.val('');
|
||||||
|
});
|
||||||
|
|
||||||
|
$modal.on('click', '.submit-btn', function(){
|
||||||
|
$form.find('.error').html('');
|
||||||
|
|
||||||
|
if ($form.valid()) {
|
||||||
|
var url = $form.data('url');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'POST',
|
||||||
|
dataType: 'json',
|
||||||
|
url: url,
|
||||||
|
data: $form.serialize(),
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".tag-repertoire-list-container").on("change", '.tag-repertoire-source-form', function () {
|
||||||
|
var s_id = $(this).attr("data-id");
|
||||||
|
var s_value = $(this).val();
|
||||||
|
var s_name = $(this).attr("name");
|
||||||
|
var json = {};
|
||||||
|
json[s_name] = s_value;
|
||||||
|
$.ajax({
|
||||||
|
url: "/admins/tag_repertoires/" + s_id,
|
||||||
|
type: "PUT",
|
||||||
|
dataType:'script',
|
||||||
|
data: json
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -0,0 +1,36 @@
|
|||||||
|
class Admins::RepertoiresController < Admins::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@repertoires = Repertoire.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@repertoire = current_repertoire
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
Rails.logger.info("#################--------")
|
||||||
|
if params[:repertoire] && params[:repertoire][:name].present?
|
||||||
|
name = params[:repertoire][:name].to_s.strip
|
||||||
|
current_repertoire.update_attributes!(name: name)
|
||||||
|
end
|
||||||
|
@repertoires = Repertoire.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
name = params[:name].to_s.strip
|
||||||
|
return render_error('名称重复') if Repertoire.where(name: name).exists?
|
||||||
|
Repertoire.create!(name: name)
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@repertoire_id = params[:id]
|
||||||
|
current_repertoire.destroy!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def current_repertoire
|
||||||
|
@_current_repertoire = Repertoire.find params[:id]
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,45 @@
|
|||||||
|
class Admins::SubRepertoiresController < Admins::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@repertoire = current_repertoire
|
||||||
|
@sub_repertoires = current_repertoire.sub_repertoires
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
name = params[:name].to_s.strip
|
||||||
|
return render_error('名称重复') if current_repertoire.sub_repertoires.where(name: name).exists?
|
||||||
|
SubRepertoire.create!(name: name, repertoire_id: current_repertoire.id)
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@sub_repertoire = current_sub_repertoire
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if params[:sub_repertoire] && params[:sub_repertoire][:name].present?
|
||||||
|
name = params[:sub_repertoire][:name].to_s.strip
|
||||||
|
current_sub_repertoire.update_attributes!(name: name)
|
||||||
|
end
|
||||||
|
@sub_repertoires = current_sub_repertoire.repertoire&.sub_repertoires
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@sub_repertoire_id = params[:id]
|
||||||
|
current_sub_repertoire.destroy!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_sub_repertoire
|
||||||
|
@_current_sub_repertoire = SubRepertoire.find params[:id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_repertoire
|
||||||
|
@_current_repertoire = Repertoire.find params[:repertoire_id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def setting_params
|
||||||
|
params.permit(:shixun, :subject, :question)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,29 @@
|
|||||||
|
class Admins::SubjectSettingsController < Admins::BaseController
|
||||||
|
def index
|
||||||
|
default_sort('created_at', 'desc')
|
||||||
|
|
||||||
|
subjects = Admins::SubjectQuery.call(params)
|
||||||
|
@sub_disciplines = SubDiscipline.where(subject: 1).pluck(:name,:id)
|
||||||
|
@subjects = paginate subjects.includes(:repertoire, :subject_level_system, :sub_disciplines)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
sub_discipline_ids = params[:sub_disciplines] || []
|
||||||
|
sub_ids = sub_discipline_ids.reject(&:blank?).map(&:to_i)
|
||||||
|
old_sub_ids = current_subject.sub_discipline_containers.pluck(:sub_discipline_id)
|
||||||
|
new_ids = sub_ids - old_sub_ids
|
||||||
|
delete_ids = old_sub_ids - sub_ids
|
||||||
|
sub_params = new_ids.map{|sub| {sub_discipline_id: sub}}
|
||||||
|
ActiveRecord::Base.transaction do
|
||||||
|
current_subject.sub_discipline_containers.where(sub_discipline_id: delete_ids).destroy_all
|
||||||
|
current_subject.sub_discipline_containers.create!(sub_params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_subject
|
||||||
|
@_current_subject ||= Subject.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,43 @@
|
|||||||
|
class Admins::TagRepertoiresController < Admins::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@sub_repertoire = current_sub_repertoire
|
||||||
|
@tag_repertoires = current_sub_repertoire.tag_repertoires
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
name = params[:name].to_s.strip
|
||||||
|
return render_error('名称重复') if current_sub_repertoire.tag_repertoires.where(name: name).exists?
|
||||||
|
TagRepertoire.create!(name: name, sub_repertoire_id: current_sub_repertoire.id)
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@tag_repertoire = current_tag_repertoire
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if params[:tag_repertoire] && params[:tag_repertoire][:name].present?
|
||||||
|
name = params[:tag_repertoire][:name].to_s.strip
|
||||||
|
current_tag_repertoire.update_attributes!(name: name)
|
||||||
|
end
|
||||||
|
@tag_repertoires = current_tag_repertoire.sub_repertoire&.tag_repertoires
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@tag_repertoire_id = params[:id]
|
||||||
|
current_tag_repertoire.destroy!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_sub_repertoire
|
||||||
|
@_current_sub_repertoire = SubRepertoire.find params[:sub_repertoire_id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_tag_repertoire
|
||||||
|
@_current_tag_repertoire = TagRepertoire.find params[:id]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,69 @@
|
|||||||
|
class LiveLinksController < ApplicationController
|
||||||
|
before_action :require_login
|
||||||
|
before_action :find_course, only: [:index, :create]
|
||||||
|
before_action :user_course_identity, :teacher_allowed, only: [:create]
|
||||||
|
before_action :edit_auth, only: [:edit, :update]
|
||||||
|
before_action :delete_auth, only: [:destroy]
|
||||||
|
|
||||||
|
def index
|
||||||
|
lives = @course.live_links
|
||||||
|
order_str = "on_status desc, live_time desc"
|
||||||
|
@total_count = lives.size
|
||||||
|
@my_live_id = @course.live_links.find_by(user_id: current_user.id)&.id
|
||||||
|
# order_str = "live_links.id = #{@my_live_id} desc, #{order_str}" if @my_live_id.present?
|
||||||
|
lives = lives.order("#{order_str}")
|
||||||
|
@lives = paginate lives.includes(user: :user_extension)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
on_status = params[:live_time].present? && params[:live_time].to_time <= Time.now ? 1 : 0
|
||||||
|
@course.live_links.create!(create_params.merge(user_id: current_user.id, on_status: on_status))
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@live = current_live
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if params[:on_status]
|
||||||
|
tip_exception("请勿重复开启") if current_live.on_status && params[:on_status].to_i == 1
|
||||||
|
|
||||||
|
ActiveRecord::Base.transaction do
|
||||||
|
current_live.update!(on_status: params[:on_status])
|
||||||
|
|
||||||
|
# 开启时发送消息,关闭直播时删除对应的消息
|
||||||
|
if params[:on_status].to_i == 1
|
||||||
|
LivePublishJob.perform_later(current_live.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
on_status = params[:live_time].present? && params[:live_time].to_time <= Time.now ? 1 : 0
|
||||||
|
current_live.update!(create_params.merge(on_status: on_status))
|
||||||
|
end
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
current_live.destroy!
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_params
|
||||||
|
params.permit(:url, :description, :course_name, :platform, :live_time, :duration)
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_live
|
||||||
|
@_current_live = LiveLink.find params[:id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit_auth
|
||||||
|
tip_exception(403, "无权限操作") unless current_user.id == current_live.user_id || current_user.admin_or_business?
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_auth
|
||||||
|
tip_exception(403, "无权限操作") unless current_user.id == current_live.user_id || current_user.admin?
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
|||||||
|
class Weapps::ChallengesController < Weapps::BaseController
|
||||||
|
before_action :require_login
|
||||||
|
before_action :set_challenge
|
||||||
|
|
||||||
|
def is_play
|
||||||
|
# 关卡有展示效果 || 选择题 || jupyter实训 || vnc || 隐藏代码窗口 || html+css实训
|
||||||
|
# @challenge.show_type != -1 || @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc ||
|
||||||
|
# @shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
|
||||||
|
play = @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc ||
|
||||||
|
@shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
|
||||||
|
|
||||||
|
if play
|
||||||
|
normal_status(-5, "该关卡暂不支持小程序")
|
||||||
|
else
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
|
def set_challenge
|
||||||
|
@challenge = Challenge.find_by!(id: params[:id])
|
||||||
|
@shixun = @challenge.shixun
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,15 @@
|
|||||||
|
class Weapps::ShixunListsController < ApplicationController
|
||||||
|
before_action :require_login
|
||||||
|
|
||||||
|
def index
|
||||||
|
results = Weapps::ShixunSearchService.call(search_params, current_laboratory)
|
||||||
|
@total_count = results.size
|
||||||
|
@results = paginate results
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def search_params
|
||||||
|
params.permit(:keyword, :type, :page, :limit, :order, :status, :diff, :sort, :no_jupyter)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,28 @@
|
|||||||
|
class Weapps::SubjectsController < Weapps::BaseController
|
||||||
|
before_action :require_login
|
||||||
|
before_action :find_subject, except: [:index]
|
||||||
|
|
||||||
|
# 首页
|
||||||
|
def index
|
||||||
|
subjects = Weapps::SubjectQuery.call(current_laboratory, params)
|
||||||
|
@subject_count = subjects.map(&:id).size
|
||||||
|
@subjects = paginate subjects
|
||||||
|
end
|
||||||
|
|
||||||
|
# 详情
|
||||||
|
def show
|
||||||
|
# 合作团队
|
||||||
|
Rails.logger.info("##########subject: #{@subject.id}")
|
||||||
|
@members = @subject.subject_members.includes(:user)
|
||||||
|
shixuns = @subject.shixuns.published.pluck(:id)
|
||||||
|
challenge_ids = Challenge.where(shixun_id: shixuns).pluck(:id)
|
||||||
|
# 实训路径中的所有实训标签
|
||||||
|
@tags = ChallengeTag.where(challenge_id: challenge_ids).pluck(:name).uniq
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def find_subject
|
||||||
|
@subject = Subject.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,16 @@
|
|||||||
|
class Weapps::UnbindAccountsController < Weapps::BaseController
|
||||||
|
before_action :require_login
|
||||||
|
|
||||||
|
def show
|
||||||
|
@user = current_user
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
open_user = OpenUsers::Wechat.find_by!(user_id: current_user.id)
|
||||||
|
session[:unionid] = open_user.uid
|
||||||
|
open_user.destroy!
|
||||||
|
UserAction.create(action_id: current_user.id, action_type: "UnbindWechat", user_id: current_user.id, :ip => request.remote_ip)
|
||||||
|
logout_user
|
||||||
|
render_ok
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,27 @@
|
|||||||
|
# 直播开启的消息通知
|
||||||
|
class LivePublishJob < ApplicationJob
|
||||||
|
queue_as :notify
|
||||||
|
|
||||||
|
def perform(live_id)
|
||||||
|
live = LiveLink.find_by(id: live_id)
|
||||||
|
return if live.blank? || live.course.blank?
|
||||||
|
course = live.course
|
||||||
|
|
||||||
|
attrs = %i[
|
||||||
|
user_id trigger_user_id container_id container_type parent_container_id parent_container_type
|
||||||
|
belong_container_id belong_container_type viewed tiding_type created_at updated_at
|
||||||
|
]
|
||||||
|
|
||||||
|
same_attrs = {
|
||||||
|
trigger_user_id: live.user_id, container_id: live.id, container_type: 'LiveLink',
|
||||||
|
parent_container_id: live.id, parent_container_type: 'LiveLink',
|
||||||
|
belong_container_id: live.course_id, belong_container_type: 'Course',
|
||||||
|
viewed: 0, tiding_type: 'LiveLink'
|
||||||
|
}
|
||||||
|
Tiding.bulk_insert(*attrs) do |worker|
|
||||||
|
course.students.pluck(:user_id).each do |user_id|
|
||||||
|
worker.add same_attrs.merge(user_id: user_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,4 @@
|
|||||||
|
class CourseVideo < ApplicationRecord
|
||||||
|
belongs_to :course
|
||||||
|
belongs_to :video
|
||||||
|
end
|
@ -0,0 +1,21 @@
|
|||||||
|
class LiveLink < ApplicationRecord
|
||||||
|
belongs_to :course
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
has_many :tidings, as: :container, dependent: :destroy
|
||||||
|
|
||||||
|
# validates :url, format: { with: CustomRegexp::URL, message: "必须为网址超链接" }
|
||||||
|
validates :description, length: { maximum: 100, too_long: "不能超过100个字符" }
|
||||||
|
validates :course_name, presence: true
|
||||||
|
validates :platform, presence: true
|
||||||
|
# validates :live_time, presence: true
|
||||||
|
validates :duration, numericality: { only_integer: true, greater_than: 0}, allow_blank: true
|
||||||
|
|
||||||
|
def op_auth?
|
||||||
|
user == User.current || User.current.admin_or_business?
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_auth?
|
||||||
|
user == User.current || User.current.admin?
|
||||||
|
end
|
||||||
|
end
|
@ -1,9 +1,13 @@
|
|||||||
class SubDiscipline < ApplicationRecord
|
class SubDiscipline < ApplicationRecord
|
||||||
belongs_to :discipline
|
belongs_to :discipline
|
||||||
has_many :tag_disciplines, dependent: :destroy
|
has_many :tag_disciplines, dependent: :destroy
|
||||||
|
has_many :sub_discipline_containers, dependent: :destroy
|
||||||
has_one :hack
|
has_one :hack
|
||||||
|
|
||||||
has_many :shixun_tag_disciplines, -> { where("shixun = 1") }, class_name: "TagDiscipline"
|
has_many :shixun_tag_disciplines, -> { where("shixun = 1") }, class_name: "TagDiscipline"
|
||||||
has_many :subject_tag_disciplines, -> { where("subject = 1") }, class_name: "TagDiscipline"
|
has_many :subject_tag_disciplines, -> { where("subject = 1") }, class_name: "TagDiscipline"
|
||||||
has_many :question_tag_disciplines, -> { where("question = 1") }, class_name: "TagDiscipline"
|
has_many :question_tag_disciplines, -> { where("question = 1") }, class_name: "TagDiscipline"
|
||||||
|
|
||||||
|
validates_presence_of :name
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
class SubDisciplineContainer < ApplicationRecord
|
||||||
|
belongs_to :sub_discipline
|
||||||
|
|
||||||
|
belongs_to :container, polymorphic: true, optional: true, touch: true
|
||||||
|
end
|
@ -0,0 +1,37 @@
|
|||||||
|
class Weapps::SubjectQuery < ApplicationQuery
|
||||||
|
include CustomSortable
|
||||||
|
attr_reader :params
|
||||||
|
|
||||||
|
def initialize(current_laboratory, params)
|
||||||
|
@current_laboratory = current_laboratory
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
subjects = @current_laboratory.subjects.unhidden.visible
|
||||||
|
|
||||||
|
# 课程体系的过滤
|
||||||
|
if params[:sub_discipline_id].present?
|
||||||
|
subjects = subjects.joins(:sub_disciplines).where(sub_disciplines: {id: params[:sub_discipline_id]})
|
||||||
|
elsif params[:discipline_id].present?
|
||||||
|
subjects = subjects.joins(:sub_disciplines).where(sub_disciplines: {discipline_id: params[:discipline_id]})
|
||||||
|
else
|
||||||
|
subjects = subjects.joins(:sub_discipline_containers).where(sub_discipline_containers: {container_type: "Subject"})
|
||||||
|
end
|
||||||
|
|
||||||
|
subjects = subjects.left_joins(:shixuns).select('subjects.id, subjects.name, subjects.excellent, subjects.stages_count, subjects.status, subjects.homepage_show,
|
||||||
|
subjects.shixuns_count, subjects.updated_at, IFNULL(sum(shixuns.myshixuns_count), 0) myshixuns_count')
|
||||||
|
.group('subjects.id').order("subjects.homepage_show #{sort_type}, #{order_type} #{sort_type}")
|
||||||
|
subjects
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def order_type
|
||||||
|
params[:order] || "updated_at"
|
||||||
|
end
|
||||||
|
|
||||||
|
def sort_type
|
||||||
|
params[:sort] || "desc"
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,53 @@
|
|||||||
|
class Weapps::ShixunSearchService < ApplicationService
|
||||||
|
|
||||||
|
attr_reader :params, :laboratory
|
||||||
|
|
||||||
|
def initialize(params, laboratory)
|
||||||
|
@params = params
|
||||||
|
@laboratory = laboratory
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
# 全部实训/我的实训
|
||||||
|
type = params[:type] || "all"
|
||||||
|
shixuns = laboratory.shixuns.published.no_jupyter
|
||||||
|
|
||||||
|
if type == "mine"
|
||||||
|
shixuns = shixuns.where(id: User.current.shixuns)
|
||||||
|
else
|
||||||
|
# 超级管理员用户显示所有未隐藏的实训、非管理员显示所有已发布的实训(对本单位公开且未隐藏未关闭)
|
||||||
|
if User.current.admin? || User.current.business? || !User.current.school_id
|
||||||
|
shixuns = shixuns.where(hidden: 0)
|
||||||
|
else
|
||||||
|
shixun_ids = ShixunSchool.where(school_id: User.current.school_id).pluck(:shixun_id)
|
||||||
|
shixun_ids = shixun_ids.reject(&:blank?).length == 0 ? -1 : shixun_ids.join(",")
|
||||||
|
|
||||||
|
shixuns = shixuns.where("use_scope = 0 or shixuns.id in (#{shixun_ids})").unhidden.publiced.or(shixuns.where(id: User.current.shixuns))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
## 筛选 难度
|
||||||
|
if params[:diff].present? && params[:diff].to_i != 0
|
||||||
|
shixuns = shixuns.where(trainee: params[:diff])
|
||||||
|
end
|
||||||
|
|
||||||
|
unless params[:keyword].blank?
|
||||||
|
keyword = params[:keyword].strip
|
||||||
|
shixuns = shixuns.joins(:user).
|
||||||
|
where("concat(lastname, firstname) like :keyword or shixuns.name like :keyword",
|
||||||
|
keyword: "%#{keyword}%", name: "%#{keyword.split(" ").join("%")}%").distinct
|
||||||
|
end
|
||||||
|
|
||||||
|
shixuns.order("#{sort_str} #{order_str}")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def order_str
|
||||||
|
params[:order] || "desc"
|
||||||
|
end
|
||||||
|
|
||||||
|
def sort_str
|
||||||
|
params[:sort] || "myshixuns_count"
|
||||||
|
end
|
||||||
|
end
|
@ -1,2 +1,6 @@
|
|||||||
|
<% if @message.present? %>
|
||||||
|
$.notify({ message: "<%= @message %>" });
|
||||||
|
<% else %>
|
||||||
$('.modal.admin-edit-discipline-modal').modal("hide");
|
$('.modal.admin-edit-discipline-modal').modal("hide");
|
||||||
$(".discipline-list-container").html("<%= j(render :partial => 'admins/disciplines/shared/list') %>");
|
$(".discipline-list-container").html("<%= j(render :partial => 'admins/disciplines/shared/list') %>");
|
||||||
|
<% end %>
|
@ -0,0 +1,2 @@
|
|||||||
|
$.notify({ message: '删除成功' });
|
||||||
|
$(".discipline-item-<%= @repertoire_id %>").remove();
|
@ -0,0 +1,2 @@
|
|||||||
|
$('.admin-modal-container').html("<%= j( render partial: 'admins/repertoires/shared/edit_repertoire_modal', locals: { repertoire: @repertoire } ) %>");
|
||||||
|
$('.modal.admin-edit-repertoire-modal').modal('show');
|
@ -0,0 +1,15 @@
|
|||||||
|
<% define_admin_breadcrumbs do %>
|
||||||
|
<% add_admin_breadcrumb('技术体系', admins_repertoires_path) %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="box search-form-container repertoires-list-form rig">
|
||||||
|
<div class="flex-1">
|
||||||
|
<%= javascript_void_link '新增', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-create-repertoire-modal' } %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="box admin-list-container repertoire-list-container">
|
||||||
|
<%= render(partial: 'admins/repertoires/shared/list') %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= render 'admins/repertoires/shared/create_repertoire_modal' %>
|
@ -0,0 +1,28 @@
|
|||||||
|
<div class="modal fade admin-create-repertoire-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">新建课程方向</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-create-repertoire-form" data-url="<%= admins_repertoires_path %>">
|
||||||
|
<div class="form-group d-flex">
|
||||||
|
<label for="new_mirror_id" class="col-form-label">名称:</label>
|
||||||
|
<div class="w-75 d-flex flex-column">
|
||||||
|
<%= text_field_tag(:name, nil, class: 'form-control', placeholder: '请输入名称') %>
|
||||||
|
</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>
|
@ -0,0 +1,23 @@
|
|||||||
|
<div class="modal fade admin-edit-repertoire-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">编辑技术体系</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<%= simple_form_for([:admins, repertoire], html: { class: 'admin-edit-repertoire-form' }, defaults: { wrapper_html: { class: 'offset-md-1 col-md-10' } }) do |f| %>
|
||||||
|
<%= f.input :name, as: :string, label: '名称' %>
|
||||||
|
|
||||||
|
<div class="error text-danger"></div>
|
||||||
|
<% end %>
|
||||||
|
</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>
|
@ -0,0 +1,27 @@
|
|||||||
|
<table class="table table-hover text-center repertoires-list-table">
|
||||||
|
<thead class="thead-light">
|
||||||
|
<tr>
|
||||||
|
<th width="6%">序号</th>
|
||||||
|
<th width="54%" class="text-left">技术体系</th>
|
||||||
|
<th width="16%">操作</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% if @repertoires.present? %>
|
||||||
|
<% @repertoires.each_with_index do |repertoire, index| %>
|
||||||
|
<tr class="repertoire-item discipline-item-<%= repertoire.id %>">
|
||||||
|
<td><%= index + 1 %></td>
|
||||||
|
<td class="text-left">
|
||||||
|
<span><%= link_to repertoire.name, admins_sub_repertoires_path(repertoire_id: repertoire), :title => repertoire.name %></span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<%= link_to '编辑', edit_admins_repertoire_path(repertoire), remote: true, class: 'action' %>
|
||||||
|
<%= delete_link '删除', admins_repertoire_path(repertoire, element: ".repertoire-item-#{repertoire.id}"), class: 'delete-repertoire-action' %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<%= render 'admins/shared/no_data_for_table' %>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
@ -0,0 +1,2 @@
|
|||||||
|
$('.modal.admin-edit-repertoire-modal').modal("hide");
|
||||||
|
$(".repertoire-list-container").html("<%= j(render :partial => 'admins/repertoires/shared/list') %>");
|
@ -0,0 +1 @@
|
|||||||
|
$.notify({ message: '更新成功' });
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue