From 02b6646bd2bf39e76283de3fd9cf1e0b2ae89879 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 20 Dec 2019 10:33:57 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/item_banks_controller.rb | 17 +++++++--- app/forms/item_banks/save_item_form.rb | 13 ++++++++ app/models/item_bank.rb | 15 ++++++++- app/models/item_bank_tag_repertoire.rb | 4 +++ app/queries/item_bank_query.rb | 33 +++++++++++++++++++ app/services/item_banks/save_item_service.rb | 13 ++++++++ app/views/item_banks/index.json.jbuilder | 14 ++++++++ ...20191219092851_migrate_item_bank_column.rb | 7 ++++ ...095652_create_item_bank_tag_repertoires.rb | 10 ++++++ ...9101909_change_item_bank_public_default.rb | 7 ++++ spec/models/item_bank_tag_repertoire_spec.rb | 5 +++ 11 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 app/forms/item_banks/save_item_form.rb create mode 100644 app/models/item_bank_tag_repertoire.rb create mode 100644 app/queries/item_bank_query.rb create mode 100644 app/services/item_banks/save_item_service.rb create mode 100644 app/views/item_banks/index.json.jbuilder create mode 100644 db/migrate/20191219092851_migrate_item_bank_column.rb create mode 100644 db/migrate/20191219095652_create_item_bank_tag_repertoires.rb create mode 100644 db/migrate/20191219101909_change_item_bank_public_default.rb create mode 100644 spec/models/item_bank_tag_repertoire_spec.rb diff --git a/app/controllers/item_banks_controller.rb b/app/controllers/item_banks_controller.rb index 104851676..3ed8c76b8 100644 --- a/app/controllers/item_banks_controller.rb +++ b/app/controllers/item_banks_controller.rb @@ -1,14 +1,21 @@ -class LibrariesController < ApplicationController +class ItemBanksController < ApplicationController include PaginateHelper + before_action :require_login def index - default_sort('updated_at', 'desc') - - @items = ItemBankQuery.call(params) - @items = paginate courses.includes(:school, :students, :attachments, :homework_commons, teacher: :user_extension) + items = ItemBankQuery.call(params) + @items_count = items.size + @items = paginate items.includes(:item_analysis, :user) end def create + item = ItemBank.new(user: current_user) + ItemBank::SaveItemService.call(item, form_params) + end + private + def form_params + params.permit(:repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, tag_repertoire_id: [], choices: []) end + end \ No newline at end of file diff --git a/app/forms/item_banks/save_item_form.rb b/app/forms/item_banks/save_item_form.rb new file mode 100644 index 000000000..6e59aa384 --- /dev/null +++ b/app/forms/item_banks/save_item_form.rb @@ -0,0 +1,13 @@ +class ItemBank::SaveItemForm + include ActiveModel::Model + + attr_accessor :repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :tag_repertoire_id, :choices + + validates :repertoire_id, presence: true + validates :sub_repertoire_id, presence: true + validates :item_type, presence: true + validates :difficulty, presence: true + validates :name, presence: true + + +end \ No newline at end of file diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb index 8078a55e0..a7cf6c579 100644 --- a/app/models/item_bank.rb +++ b/app/models/item_bank.rb @@ -1,11 +1,24 @@ class ItemBank < ApplicationRecord # difficulty: 1 简单 2 适中 3 困难 # item_type: 0 单选 1 多选 2 判断 3 填空 4 简答 5 实训 6 编程 - enum item_type: { SINGLE: 0, MULTIPLE: 1, JUDGMENT: 2, COMPLETION: 3, SUBJECTIVE: 4, PRACTICAL: 5, PROGRAM: 6 } + # 试卷的问题类型 + SINGLE = 0 #单选题 + MULTIPLE = 1 #多选题 + JUDGMENT = 2 #判断题 + COMPLETION = 3 # 填空题 + SUBJECTIVE = 4 # 主观题 + PRACTICAL = 5 #实训题 + PROGRAM = 6 #编程题 belongs_to :user + belongs_to :sub_repertoire has_one :item_analysis, dependent: :destroy has_many :item_choices, dependent: :destroy has_many :item_baskets, dependent: :destroy + has_many :item_bank_tag_repertoires, dependent: :destroy + + def analysisi + item_analysis&.analysis + end end diff --git a/app/models/item_bank_tag_repertoire.rb b/app/models/item_bank_tag_repertoire.rb new file mode 100644 index 000000000..271cad6b0 --- /dev/null +++ b/app/models/item_bank_tag_repertoire.rb @@ -0,0 +1,4 @@ +class ItemBankTagRepertoire < ApplicationRecord + belongs_to :item_bank + belongs_to :tag_repertoire +end diff --git a/app/queries/item_bank_query.rb b/app/queries/item_bank_query.rb new file mode 100644 index 000000000..34db153f0 --- /dev/null +++ b/app/queries/item_bank_query.rb @@ -0,0 +1,33 @@ +class ItemBankQuery < ApplicationQuery + include CustomSortable + attr_reader :params + + sort_columns :updated_at, default_by: :updated_at, default_direction: :desc, default_table: 'item_banks' + + def initialize(params) + @params = params + end + + def call + if params[:public].to_i == 1 + items = ItemBank.where(public: 1) + elsif params[:public].to_i == 0 + items = ItemBank.where(user_id: User.current.id) + end + + if params[:tag_repertoire_id].present? + items = items.joins(:item_bank_tag_repertoires).where(item_bank_tag_repertoires: {tag_repertoire_id: params[:tag_repertoire_id]}) + elsif params[:sub_repertoire_id].present? + items = items.where(sub_repertoire_id: params[:sub_repertoire_id]) + elsif params[:repertoire_id].present? + items = items.joins(:sub_repertoire).where(sub_repertoires: {repertoire_id: params[:repertoire_id]}) + end + + items = items.where(item_type: params[:item_type].to_i) if params[:item_type].present? + items = items.where(difficulty: params[:difficulty].to_i) if params[:difficulty].present? + + items = items.where("name like ?", "%#{params[:keyword].strip}%") if params[:keyword].present? + + custom_sort(items, params[:sort_by], params[:sort_direction]) + end +end \ No newline at end of file diff --git a/app/services/item_banks/save_item_service.rb b/app/services/item_banks/save_item_service.rb new file mode 100644 index 000000000..ec9930aaa --- /dev/null +++ b/app/services/item_banks/save_item_service.rb @@ -0,0 +1,13 @@ +class ItemBank::SaveItemService < ApplicationService + attr_reader :item, :params + + def initialize(item, params) + @item = item + @params = params + end + + def call + Competitions::SaveTeamForm.new(params).validate! + + end +end \ No newline at end of file diff --git a/app/views/item_banks/index.json.jbuilder b/app/views/item_banks/index.json.jbuilder new file mode 100644 index 000000000..991cf9592 --- /dev/null +++ b/app/views/item_banks/index.json.jbuilder @@ -0,0 +1,14 @@ +json.items @items.each do |item| + json.(item, :id, :name, :item_type, :difficulty, :public, :quotes) + json.analysisi item.analysisi + json.update_time item.updated_at&.strftime("%Y-%m-%d %H:%M") + json.author do + json.login item.user&.login + json.name item.user&.full_name + end + json.choices item.item_choices do |choice| + json.choice_text choice.choice_text + json.is_answer choice.is_answer + end +end +json.items_count @items_count \ No newline at end of file diff --git a/db/migrate/20191219092851_migrate_item_bank_column.rb b/db/migrate/20191219092851_migrate_item_bank_column.rb new file mode 100644 index 000000000..ec880ad03 --- /dev/null +++ b/db/migrate/20191219092851_migrate_item_bank_column.rb @@ -0,0 +1,7 @@ +class MigrateItemBankColumn < ActiveRecord::Migration[5.2] + def change + remove_column :item_banks, :curriculum_id + remove_column :item_banks, :curriculum_direction_id + add_column :item_banks, :sub_repertoire_id, :integer, index: true + end +end diff --git a/db/migrate/20191219095652_create_item_bank_tag_repertoires.rb b/db/migrate/20191219095652_create_item_bank_tag_repertoires.rb new file mode 100644 index 000000000..c6ce93bc6 --- /dev/null +++ b/db/migrate/20191219095652_create_item_bank_tag_repertoires.rb @@ -0,0 +1,10 @@ +class CreateItemBankTagRepertoires < ActiveRecord::Migration[5.2] + def change + create_table :item_bank_tag_repertoires do |t| + t.references :item_bank, index: true + t.references :tag_repertoire, index: true + + t.timestamps + end + end +end diff --git a/db/migrate/20191219101909_change_item_bank_public_default.rb b/db/migrate/20191219101909_change_item_bank_public_default.rb new file mode 100644 index 000000000..4ad470258 --- /dev/null +++ b/db/migrate/20191219101909_change_item_bank_public_default.rb @@ -0,0 +1,7 @@ +class ChangeItemBankPublicDefault < ActiveRecord::Migration[5.2] + def change + change_column_default :item_banks, :public, 0 + change_column_default :item_banks, :quotes, 0 + change_column_default :item_banks, :difficulty, 1 + end +end diff --git a/spec/models/item_bank_tag_repertoire_spec.rb b/spec/models/item_bank_tag_repertoire_spec.rb new file mode 100644 index 000000000..dce195849 --- /dev/null +++ b/spec/models/item_bank_tag_repertoire_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ItemBankTagRepertoire, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From c564e68a97b829b43523e8ebff0263101d9de675 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 20 Dec 2019 22:19:33 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/item_banks_controller.rb | 40 ++++++++++++++- app/controllers/item_baskets_controller.rb | 30 ++++++++++++ app/forms/item_banks/save_item_form.rb | 30 ++++++++++-- app/models/item_bank.rb | 3 +- app/models/user.rb | 4 ++ app/services/item_banks/save_item_service.rb | 49 ++++++++++++++++++- .../item_baskets/save_item_basket_service.rb | 47 ++++++++++++++++++ app/views/item_banks/edit.json.jbuilder | 15 ++++++ app/views/item_banks/index.json.jbuilder | 2 +- config/routes.rb | 6 +++ ...1220084001_add_position_score_to_basket.rb | 7 +++ 11 files changed, 222 insertions(+), 11 deletions(-) create mode 100644 app/controllers/item_baskets_controller.rb create mode 100644 app/services/item_baskets/save_item_basket_service.rb create mode 100644 app/views/item_banks/edit.json.jbuilder create mode 100644 db/migrate/20191220084001_add_position_score_to_basket.rb diff --git a/app/controllers/item_banks_controller.rb b/app/controllers/item_banks_controller.rb index 3ed8c76b8..767d3d61f 100644 --- a/app/controllers/item_banks_controller.rb +++ b/app/controllers/item_banks_controller.rb @@ -1,6 +1,8 @@ class ItemBanksController < ApplicationController include PaginateHelper before_action :require_login + before_action :find_item, except: [:index, :create] + before_action :edit_auth, only: [:update, :destroy, :set_public] def index items = ItemBankQuery.call(params) @@ -10,12 +12,46 @@ class ItemBanksController < ApplicationController def create item = ItemBank.new(user: current_user) - ItemBank::SaveItemService.call(item, form_params) + ItemBanks::SaveItemService.call(item, form_params) + render_ok + rescue ApplicationService::Error => ex + render_error(ex.message) + end + + def edit + + end + + def update + ItemBanks::SaveItemService.call(@item, form_params) + render_ok + rescue ApplicationService::Error => ex + render_error(ex.message) + end + + def destroy + @item.destroy! + render_ok + end + + def set_public + tip_exception(-1, "该试题已公开") if @item.public? + @item.update_attributes!(public: 1) + render_ok end private + + def find_item + @item = ItemBank.find_by!(id: params[:id]) + end + + def edit_auth + current_user.admin_or_business? || @item.user == current_user + end + def form_params - params.permit(:repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, tag_repertoire_id: [], choices: []) + params.permit(:repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :analysis, tag_repertoire_id: [], choices: %i[choice_text is_answer]) end end \ No newline at end of file diff --git a/app/controllers/item_baskets_controller.rb b/app/controllers/item_baskets_controller.rb new file mode 100644 index 000000000..12d3f5617 --- /dev/null +++ b/app/controllers/item_baskets_controller.rb @@ -0,0 +1,30 @@ +class ItemBasketsController < ApplicationController + before_action :require_login + + def index + + end + + def create + ItemBaskets::SaveItemBasketService.call(current_user, create_params) + end + + def destroy + item = current_user.item_baskets.find_by!(item_bank_id: params[:id]) + ActiveRecord::Base.transaction do + current_user.item_baskets.where("item_type = #{item.item_type} and position > #{item.position}").update_all("position = position -1") + item.destroy! + end + render_ok + end + + def delete_item_type + # tip_exception() unless + end + + private + + def create_params + params.permit(item_ids: []) + end +end \ No newline at end of file diff --git a/app/forms/item_banks/save_item_form.rb b/app/forms/item_banks/save_item_form.rb index 6e59aa384..a323be7d4 100644 --- a/app/forms/item_banks/save_item_form.rb +++ b/app/forms/item_banks/save_item_form.rb @@ -1,13 +1,33 @@ -class ItemBank::SaveItemForm +class ItemBanks::SaveItemForm include ActiveModel::Model - attr_accessor :repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :tag_repertoire_id, :choices + attr_accessor :repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :analysis, :tag_repertoire_id, :choices validates :repertoire_id, presence: true validates :sub_repertoire_id, presence: true - validates :item_type, presence: true - validates :difficulty, presence: true - validates :name, presence: true + validates :item_type, presence: true, inclusion: {in: 0..6}, numericality: { only_integer: true } + validates :difficulty, presence: true, inclusion: {in: 1..3}, numericality: { only_integer: true } + validates :name, presence: true, length: { maximum: 1000 } + validates :analysis, length: { maximum: 1000 } + def validate! + super + return unless errors.blank? + choices.each { |item| SubForm.new(item).validate! } if item_type < 3 + return unless errors.blank? + if [0, 2].include?(item_type) && choices.pluck(:is_answer).select{|item| item == 1}.length > 1 + raise("正确答案只能有一个") + elsif item_type == 1 && choices.pluck(:is_answer).select{|item| item == 1}.length <= 1 + raise("多选题至少有两个正确答案") + end + end + class SubForm + include ActiveModel::Model + + attr_accessor :choice_text, :is_answer + + validates :choice_text, presence: true, length: { maximum: 100 } + validates :is_answer, presence: true, inclusion: {in: 0..1}, numericality: { only_integer: true } + end end \ No newline at end of file diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb index a7cf6c579..03e3fddb3 100644 --- a/app/models/item_bank.rb +++ b/app/models/item_bank.rb @@ -17,8 +17,9 @@ class ItemBank < ApplicationRecord has_many :item_choices, dependent: :destroy has_many :item_baskets, dependent: :destroy has_many :item_bank_tag_repertoires, dependent: :destroy + has_many :tag_repertoires, through: :item_bank_tag_repertoires - def analysisi + def analysis item_analysis&.analysis end end diff --git a/app/models/user.rb b/app/models/user.rb index a9b2f0b3a..d6c264e15 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -153,6 +153,10 @@ class User < ApplicationRecord has_many :hacks, dependent: :destroy has_many :hack_user_lastest_codes, dependent: :destroy + # 题库 + has_many :item_banks, dependent: :destroy + has_many :item_baskets, -> { order("item_baskets.position ASC") }, dependent: :destroy + # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/services/item_banks/save_item_service.rb b/app/services/item_banks/save_item_service.rb index ec9930aaa..2fc838c4c 100644 --- a/app/services/item_banks/save_item_service.rb +++ b/app/services/item_banks/save_item_service.rb @@ -1,4 +1,4 @@ -class ItemBank::SaveItemService < ApplicationService +class ItemBanks::SaveItemService < ApplicationService attr_reader :item, :params def initialize(item, params) @@ -7,7 +7,52 @@ class ItemBank::SaveItemService < ApplicationService end def call - Competitions::SaveTeamForm.new(params).validate! + new_record = item.new_record? + raise("不能更改题型") if !new_record && item.item_type != params[:item_type] + ItemBanks::SaveItemForm.new(params).validate! + ActiveRecord::Base.transaction do + item.item_type = params[:item_type] if new_record + item.difficulty = params[:difficulty] + item.sub_repertoire_id = params[:sub_repertoire_id] + item.name = params[:name].strip + item.save! + + analysis = item.item_analysis || ItemAnalysis.new(item_bank_id: item.id) + analysis.analysis = params[:analysis].blank? ? nil : params[:analysis].strip + analysis.save + + # 知识点的创建 + new_tag_repertoire_ids = params[:tag_repertoire_id] + old_tag_repertoire_ids = item.item_bank_tag_repertoires.pluck(:tag_repertoire_id) + delete_tag_repertoire_ids = old_tag_repertoire_ids - new_tag_repertoire_ids + create_tag_repertoire_ids = new_tag_repertoire_ids - old_tag_repertoire_ids + item.item_bank_tag_repertoires.where(tag_repertoire_id: delete_tag_repertoire_ids).destroy_all + create_tag_repertoire_ids.each do |tag_id| + item.item_bank_tag_repertoires << ItemBankTagRepertoire.new(tag_repertoire_id: tag_id) + end + + # 选项的创建 + if item.item_type < 3 + old_choices = item.item_choices + new_choices = params[:choices] + + new_choices.each_with_index do |choice, index| + choice_item = old_choices[index] || ItemChoice.new(item_bank_id: item.id) + choice_item.choice_text = choice[:choice_text] + choice_item.is_answer = choice[:is_answer] + choice_item.save! + end + + if old_choices.length > new_choices.length + old_choices[new_choices.length..(old_choices.length-1)].each do |old_choice| + old_choice.destroy + end + end + + end + end + + item end end \ No newline at end of file diff --git a/app/services/item_baskets/save_item_basket_service.rb b/app/services/item_baskets/save_item_basket_service.rb new file mode 100644 index 000000000..36ea46cb2 --- /dev/null +++ b/app/services/item_baskets/save_item_basket_service.rb @@ -0,0 +1,47 @@ +class ItemBaskets::SaveItemBasketService < ApplicationService + attr_reader :user, :params + + def initialize(user, params) + @user = user + @params = params + end + + def call + raise("请选择试题") if params[:item_ids].blank? + + # 只能选用公共题库或是自己的题库 + items = ItemBank.where(public: 1).or(ItemBank.where(user_id: user.id)) + + # 已选到过试题篮的不重复选用 + item_ids = params[:item_ids] - user.item_baskets.pluck(:item_bank_id) + items.where(id: item_ids).each do |item| + new_item = ItemBasket.new(user_id: user.id, item_bank_id: item.id, item_type: item.item_type) + new_item.score = item_score item.item_type + new_item.position = item_position item.item_type + new_item.save! + end + end + + private + + def item_score item_type + if user.item_baskets.where(item_type: item_type).last.present? + score = user.item_baskets.where(item_type: item_type).last.score + else + score = + case item_type + when 0, 1, 2 + 5 + when 6 + 10 + else + 5 + end + end + score + end + + def item_position item_type + user.item_baskets.where(item_type: item_type).last&.position.to_i + 1 + end +end \ No newline at end of file diff --git a/app/views/item_banks/edit.json.jbuilder b/app/views/item_banks/edit.json.jbuilder new file mode 100644 index 000000000..569a2cb86 --- /dev/null +++ b/app/views/item_banks/edit.json.jbuilder @@ -0,0 +1,15 @@ +json.repertoire do + json.(@item.sub_repertoire&.repertoire, :id, :name) +end +json.sub_repertoire do + json.(@item.sub_repertoire, :id, :name) +end +json.tag_repertoires @item.tag_repertoires do |tag| + json.(tag, :id, :name) +end +json.(@item, :id, :name, :item_type, :difficulty) +json.analysis @item.analysis +json.choices @item.item_choices do |choice| + json.choice_text choice.choice_text + json.is_answer choice.is_answer +end \ No newline at end of file diff --git a/app/views/item_banks/index.json.jbuilder b/app/views/item_banks/index.json.jbuilder index 991cf9592..5b965c362 100644 --- a/app/views/item_banks/index.json.jbuilder +++ b/app/views/item_banks/index.json.jbuilder @@ -1,6 +1,6 @@ json.items @items.each do |item| json.(item, :id, :name, :item_type, :difficulty, :public, :quotes) - json.analysisi item.analysisi + json.analysis item.analysis json.update_time item.updated_at&.strftime("%Y-%m-%d %H:%M") json.author do json.login item.user&.login diff --git a/config/routes.rb b/config/routes.rb index 0d2aba843..2ca65c8e2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -49,6 +49,12 @@ Rails.application.routes.draw do end resources :item_banks do + member do + post :set_public + end + end + + resources :item_baskets do end diff --git a/db/migrate/20191220084001_add_position_score_to_basket.rb b/db/migrate/20191220084001_add_position_score_to_basket.rb new file mode 100644 index 000000000..3f4057018 --- /dev/null +++ b/db/migrate/20191220084001_add_position_score_to_basket.rb @@ -0,0 +1,7 @@ +class AddPositionScoreToBasket < ActiveRecord::Migration[5.2] + def change + add_column :item_baskets, :position, :integer, default: 0 + add_column :item_baskets, :score, :float, default: 0 + add_column :item_baskets, :item_type, :integer, default: 0 + end +end From 71d5786b24f8ea63ccc4f2ca1941ec06ce44421d Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 23 Dec 2019 16:02:52 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/item_baskets_controller.rb | 13 +++++++++++++ app/forms/item_banks/save_item_form.rb | 4 ++-- app/models/item_bank.rb | 9 +-------- app/models/item_basket.rb | 2 ++ app/services/item_banks/save_item_service.rb | 2 +- app/views/item_baskets/basket_list.json.jbuilder | 7 +++++++ config/routes.rb | 4 +++- 7 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 app/views/item_baskets/basket_list.json.jbuilder diff --git a/app/controllers/item_baskets_controller.rb b/app/controllers/item_baskets_controller.rb index 12d3f5617..93c568ae5 100644 --- a/app/controllers/item_baskets_controller.rb +++ b/app/controllers/item_baskets_controller.rb @@ -5,8 +5,21 @@ class ItemBasketsController < ApplicationController end + def basket_list + @single_questions_count = current_user.item_baskets.where(item_type: "SINGLE").count + @multiple_questions_count = current_user.item_baskets.where(item_type: "MULTIPLE").count + @judgement_questions_count = current_user.item_baskets.where(item_type: "JUDGMENT").count + @completion_questions_count = current_user.item_baskets.where(item_type: "COMPLETION").count + @subjective_questions_count = current_user.item_baskets.where(item_type: "SUBJECTIVE").count + @practical_questions_count = current_user.item_baskets.where(item_type: "PRACTICAL").count + @program_questions_count = current_user.item_baskets.where(item_type: "PROGRAM").count + end + def create ItemBaskets::SaveItemBasketService.call(current_user, create_params) + render_ok + rescue ApplicationService::Error => ex + render_error(ex.message) end def destroy diff --git a/app/forms/item_banks/save_item_form.rb b/app/forms/item_banks/save_item_form.rb index a323be7d4..b92df1d89 100644 --- a/app/forms/item_banks/save_item_form.rb +++ b/app/forms/item_banks/save_item_form.rb @@ -5,7 +5,7 @@ class ItemBanks::SaveItemForm validates :repertoire_id, presence: true validates :sub_repertoire_id, presence: true - validates :item_type, presence: true, inclusion: {in: 0..6}, numericality: { only_integer: true } + validates :item_type, presence: true, inclusion: {in: %W(SINGLE MULTIPLE JUDGMENT COMPLETION SUBJECTIVE PRACTICAL PROGRAM)} validates :difficulty, presence: true, inclusion: {in: 1..3}, numericality: { only_integer: true } validates :name, presence: true, length: { maximum: 1000 } validates :analysis, length: { maximum: 1000 } @@ -13,7 +13,7 @@ class ItemBanks::SaveItemForm def validate! super return unless errors.blank? - choices.each { |item| SubForm.new(item).validate! } if item_type < 3 + choices.each { |item| SubForm.new(item).validate! } if %W(SINGLE MULTIPLE JUDGMENT).include?(item_type) return unless errors.blank? if [0, 2].include?(item_type) && choices.pluck(:is_answer).select{|item| item == 1}.length > 1 raise("正确答案只能有一个") diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb index 03e3fddb3..6bc18bac7 100644 --- a/app/models/item_bank.rb +++ b/app/models/item_bank.rb @@ -1,14 +1,7 @@ class ItemBank < ApplicationRecord # difficulty: 1 简单 2 适中 3 困难 + enum item_type: { SINGLE: 0, MULTIPLE: 1, JUDGMENT: 2, COMPLETION: 3, SUBJECTIVE: 4, PRACTICAL: 5, PROGRAM: 6 } # item_type: 0 单选 1 多选 2 判断 3 填空 4 简答 5 实训 6 编程 - # 试卷的问题类型 - SINGLE = 0 #单选题 - MULTIPLE = 1 #多选题 - JUDGMENT = 2 #判断题 - COMPLETION = 3 # 填空题 - SUBJECTIVE = 4 # 主观题 - PRACTICAL = 5 #实训题 - PROGRAM = 6 #编程题 belongs_to :user belongs_to :sub_repertoire diff --git a/app/models/item_basket.rb b/app/models/item_basket.rb index d736d9bc0..b3e651e2f 100644 --- a/app/models/item_basket.rb +++ b/app/models/item_basket.rb @@ -1,4 +1,6 @@ class ItemBasket < ApplicationRecord + enum item_type: { SINGLE: 0, MULTIPLE: 1, JUDGMENT: 2, COMPLETION: 3, SUBJECTIVE: 4, PRACTICAL: 5, PROGRAM: 6 } + belongs_to :item_bank belongs_to :user end diff --git a/app/services/item_banks/save_item_service.rb b/app/services/item_banks/save_item_service.rb index 2fc838c4c..c747d6522 100644 --- a/app/services/item_banks/save_item_service.rb +++ b/app/services/item_banks/save_item_service.rb @@ -33,7 +33,7 @@ class ItemBanks::SaveItemService < ApplicationService end # 选项的创建 - if item.item_type < 3 + if %W(SINGLE MULTIPLE JUDGMENT).include?(item.item_type) old_choices = item.item_choices new_choices = params[:choices] diff --git a/app/views/item_baskets/basket_list.json.jbuilder b/app/views/item_baskets/basket_list.json.jbuilder new file mode 100644 index 000000000..11db844ab --- /dev/null +++ b/app/views/item_baskets/basket_list.json.jbuilder @@ -0,0 +1,7 @@ +json.single_questions_count @single_questions_count +json.multiple_questions_count @multiple_questions_count +json.judgement_questions_count @judgement_questions_count +json.completion_questions_count @completion_questions_count +json.subjective_questions_count @subjective_questions_count +json.practical_questions_count @practical_questions_count +json.program_questions_count @program_questions_count diff --git a/config/routes.rb b/config/routes.rb index 7c2222767..2ccfe117b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -59,7 +59,9 @@ Rails.application.routes.draw do end resources :item_baskets do - + collection do + get :basket_list + end end From 1d438ab21698e4637e33b02c95b1e9080888e0d4 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 23 Dec 2019 18:53:48 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/item_baskets_controller.rb | 6 +++++- app/models/item_basket.rb | 8 ++++++++ app/views/item_baskets/index.json.jbuilder | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 app/views/item_baskets/index.json.jbuilder diff --git a/app/controllers/item_baskets_controller.rb b/app/controllers/item_baskets_controller.rb index 93c568ae5..fc27c96d7 100644 --- a/app/controllers/item_baskets_controller.rb +++ b/app/controllers/item_baskets_controller.rb @@ -2,7 +2,11 @@ class ItemBasketsController < ApplicationController before_action :require_login def index - + @item_baskets = current_user.item_baskets + @single_questions = @item_baskets.where(item_type: "SINGLE") + @multiple_questions = @item_baskets.where(item_type: "MULTIPLE") + @judgement_questions = @item_baskets.where(item_type: "JUDGMENT") + @program_questions = @item_baskets.where(item_type: "PROGRAM") end def basket_list diff --git a/app/models/item_basket.rb b/app/models/item_basket.rb index b3e651e2f..a3ff865ba 100644 --- a/app/models/item_basket.rb +++ b/app/models/item_basket.rb @@ -3,4 +3,12 @@ class ItemBasket < ApplicationRecord belongs_to :item_bank belongs_to :user + + def all_score + User.current.item_baskets.map(&:score).sum + end + + def question_count + User.current.item_baskets.size + end end diff --git a/app/views/item_baskets/index.json.jbuilder b/app/views/item_baskets/index.json.jbuilder new file mode 100644 index 000000000..0458f38ae --- /dev/null +++ b/app/views/item_baskets/index.json.jbuilder @@ -0,0 +1 @@ +josn.single_questions \ No newline at end of file From 7c890c2438de42e72d0342e49039f4c28205abbb Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 25 Dec 2019 11:45:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E7=BB=84=E5=8D=B7?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/item_banks/_item.json.jbuilder | 6 ++++ app/views/item_banks/index.json.jbuilder | 7 +--- app/views/item_baskets/index.json.jbuilder | 39 +++++++++++++++++++++- 3 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 app/views/item_banks/_item.json.jbuilder diff --git a/app/views/item_banks/_item.json.jbuilder b/app/views/item_banks/_item.json.jbuilder new file mode 100644 index 000000000..21c61b1e2 --- /dev/null +++ b/app/views/item_banks/_item.json.jbuilder @@ -0,0 +1,6 @@ +json.(item, :id, :name, :item_type, :difficulty, :public, :quotes) +json.analysis item.analysis +json.choices item.item_choices do |choice| + json.choice_text choice.choice_text + json.is_answer choice.is_answer +end \ No newline at end of file diff --git a/app/views/item_banks/index.json.jbuilder b/app/views/item_banks/index.json.jbuilder index 5b965c362..9ba3380d8 100644 --- a/app/views/item_banks/index.json.jbuilder +++ b/app/views/item_banks/index.json.jbuilder @@ -1,14 +1,9 @@ json.items @items.each do |item| - json.(item, :id, :name, :item_type, :difficulty, :public, :quotes) - json.analysis item.analysis + json.partial! "item_banks/item", locals: {item: item} json.update_time item.updated_at&.strftime("%Y-%m-%d %H:%M") json.author do json.login item.user&.login json.name item.user&.full_name end - json.choices item.item_choices do |choice| - json.choice_text choice.choice_text - json.is_answer choice.is_answer - end end json.items_count @items_count \ No newline at end of file diff --git a/app/views/item_baskets/index.json.jbuilder b/app/views/item_baskets/index.json.jbuilder index 0458f38ae..a0f78fe41 100644 --- a/app/views/item_baskets/index.json.jbuilder +++ b/app/views/item_baskets/index.json.jbuilder @@ -1 +1,38 @@ -josn.single_questions \ No newline at end of file +json.single_questions do + json.questions @single_questions.each do |question| + json.(question, :id, :position, :score, :item_type) + json.partial! "item_banks/item", locals: {item: question.item_bank} + end + json.questions_score @single_questions.map(&:score).sum + json.questions_count @single_questions.size +end + +json.multiple_questions do + json.questions @multiple_questions.each do |question| + json.(question, :id, :position, :score, :item_type) + json.partial! "item_banks/item", locals: {item: question.item_bank} + end + json.questions_score @multiple_questions.map(&:score).sum + json.questions_count @multiple_questions.size +end + +json.judgement_questions do + json.questions @judgement_questions.each do |question| + json.(question, :id, :position, :score, :item_type) + json.partial! "item_banks/item", locals: {item: question.item_bank} + end + json.questions_score @judgement_questions.map(&:score).sum + json.questions_count @judgement_questions.size +end + +json.program_questions do + json.questions @program_questions.each do |question| + json.(question, :id, :position, :score, :item_type) + json.partial! "item_banks/item", locals: {item: question.item_bank} + end + json.questions_score @program_questions.map(&:score).sum + json.questions_count @program_questions.size +end + +json.all_score @item_baskets.map(&:score).sum +json.all_questions_count @item_baskets.size \ No newline at end of file