ADD 页面置顶功能等功能

* ADD 页面置顶功能
* ADD FAQ快速入口
* 修复bug
This commit is contained in:
jasder 2021-05-14 17:34:07 +08:00
commit 5d91b6b3be
27 changed files with 216 additions and 7 deletions

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admins/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the helps/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,58 @@
class Admins::FaqsController < Admins::BaseController
before_action :find_faq, only: [:edit,:update, :destroy]
def index
sort_by = params[:sort_by] ||= 'updated_at'
sort_direction = params[:sort_direction] ||= 'desc'
keyword = params[:keyword].to_s.strip
collection = Faq.search_question(keyword).order("#{sort_by} #{sort_direction}")
@faqs = paginate collection
end
def new
@faq = Faq.new
end
def edit
end
def update
begin
@faq.update!(faq_params)
flash[:success] = '修改成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
def destroy
@faq.destroy
redirect_to admins_faqs_path
flash[:success] = "删除成功"
end
def create
@faq = Faq.new(faq_params)
begin
@faq.save!
flash[:success] = '创建成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
private
def find_faq
@faq = Faq.find params[:id]
end
def faq_params
params.require(:faq).permit(:question, :url)
end
end

View File

@ -0,0 +1,8 @@
class Helps::FaqsController < ApplicationController
skip_before_action :check_sign, :user_setup
def index
faqs = Faq.select_without_id.order(updated_at: :desc)
render json: faqs.as_json(:except => [:id])
end
end

View File

@ -1,5 +1,5 @@
class Organizations::OrganizationsController < Organizations::BaseController
before_action :require_login, except: [:index, :show]
before_action :require_login, except: [:index, :show, :recommend]
before_action :convert_image!, only: [:create, :update]
before_action :load_organization, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:update, :destroy]
@ -62,6 +62,13 @@ class Organizations::OrganizationsController < Organizations::BaseController
tip_exception(e.message)
end
def recommend
recommend = %W(xuos Huawei_Technology openatom_foundation pkecosystem TensorLayer)
@organizations = Organization.with_visibility(%w(common))
.where(login: recommend).select(:id, :login, :firstname, :lastname, :nickname)
end
private
def convert_image!
return unless params[:image].present?

View File

@ -167,7 +167,7 @@ class ProjectsController < ApplicationController
end
def recommend
@projects = Project.recommend.includes(:repository, :project_category, :owner).order(id: :desc).limit(5)
@projects = Project.recommend.includes(:repository, :project_category, :owner).order(id: :desc)
end
def about

View File

@ -0,0 +1,2 @@
module Admins::FaqsHelper
end

View File

@ -0,0 +1,2 @@
module Helps::FaqsHelper
end

View File

@ -47,6 +47,7 @@
# watchers_count :integer default("0")
# devops_step :integer default("0")
# gitea_token :string(255)
# platform :string(255)
#
# Indexes
#

20
app/models/faq.rb Normal file
View File

@ -0,0 +1,20 @@
# == Schema Information
#
# Table name: faqs
#
# id :integer not null, primary key
# question :string(255)
# url :string(255)
# created_at :datetime not null
# updated_at :datetime not null
#
class Faq < ApplicationRecord
validates :question, presence: true,length: { maximum: 100, too_long: "最多%{count}个字符" }
validates :url, format: { with: CustomRegexp::URL, multiline: true, message: "格式不正确" }
scope :select_without_id, -> { select(:question, :url) }
scope :search_question, ->(keyword) { where("question LIKE ?", "%#{keyword}%") unless keyword.blank?}
end

View File

@ -47,6 +47,7 @@
# watchers_count :integer default("0")
# devops_step :integer default("0")
# gitea_token :string(255)
# platform :string(255)
#
# Indexes
#

View File

@ -47,6 +47,7 @@
# watchers_count :integer default("0")
# devops_step :integer default("0")
# gitea_token :string(255)
# platform :string(255)
#
# Indexes
#

View File

@ -21,9 +21,7 @@ class Repositories::MigrateService < ApplicationService
private
def repository_params
params.merge(project_id: project.id,
identifier: params[:identifier],
source_clone_url: params[:source_clone_url])
params.merge(project_id: project.id)
end
def gitea_repository_params

View File

@ -0,0 +1,24 @@
<div class="modal fade faq-change-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"><%= type == "create" ? "新增" : "编辑" %></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<%= form_for @faq, url: {controller: "faqs", action: "#{type}"} do |p| %>
<div class="modal-body">
<%= p.text_field :question,class: "form-control input-lg",placeholder: "问题",required: true, maxlength: 100%>
</div>
<div class="modal-body">
<%= p.text_field :url,class: "form-control input-lg",placeholder: "链接",required: true, maxlength: 100%>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<%= p.submit "确认", class: "btn btn-primary submit-btn" %>
</div>
<% end %>
</div>
</div>
</div>

View File

@ -0,0 +1,33 @@
<table class="table table-hover text-center subject-list-table">
<thead class="thead-light">
<tr>
<th width="5%">序号</th>
<th width="20%">标题</th>
<th width="30%">url</th>
<th width="10%"><%= sort_tag('创建于', name: 'created_at', path: admins_faqs_path) %></th>
<th width="10%"><%= sort_tag('更新于', name: 'updated_at', path: admins_faqs_path) %></th>
<th width="25%">操作</th>
</tr>
</thead>
<tbody>
<% if faqs.present? %>
<% faqs.each_with_index do |faq, index| %>
<tr class="user-item-<%= faq.id %>">
<td><%= list_index_no((params[:page] || 1).to_i, index) %></td>
<td><%= faq.question%></td>
<td><%= link_to faq.url, target: '_blank' %></td>
<td><%= display_text(faq.created_at&.strftime('%Y-%m-%d %H:%M')) %></td>
<td><%= display_text(faq.updated_at&.strftime('%Y-%m-%d %H:%M')) %></td>
<td class="action-container">
<%= link_to "编辑", edit_admins_faq_path(faq), remote: true, class: "action" %>
<%= link_to "删除", admins_faqs_path(faq.id), method: :delete, data:{confirm: "确认删除的吗?"}, class: "delete-project-action" %>
</td>
</tr>
<% end %>
<% else %>
<%= render 'admins/shared/no_data_for_table' %>
<% end %>
</tbody>
</table>
<%= render partial: 'admins/shared/paginate', locals: { objects: faqs } %>

View File

@ -0,0 +1,2 @@
$("#faq-modals").html("<%= j render(partial: 'admins/faqs/form_modal', locals: {type: 'update'}) %>")
$(".faq-change-modal").modal('show');

View File

@ -0,0 +1,17 @@
<% define_admin_breadcrumbs do %>
<% add_admin_breadcrumb('FAQ', admins_faqs_path) %>
<% end %>
<div class="box search-form-container faq-list-form">
<%= form_tag(admins_faqs_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
<%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-sm-2 ml-3', placeholder: '输入标题搜素') %>
<%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
<% end %>
<%= link_to "新增", new_admins_faq_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %>
</div>
<div class="box admin-list-container faqs-list-container">
<%= render partial: 'admins/faqs/list', locals: { faqs: @faqs } %>
</div>
<div id="faq-modals">
</div>

View File

@ -0,0 +1 @@
$('.faqs-list-container').html("<%= j( render partial: 'admins/faqs/list', locals: { faqs: @faqs } ) %>");

View File

@ -0,0 +1,2 @@
$("#faq-modals").html("<%= j render(partial: 'admins/faqs/form_modal', locals: {type: 'create'}) %>")
$(".faq-change-modal").modal('show');

View File

@ -10,7 +10,6 @@
</td>
<td>
<% if school && school.identifier.present? %>
<%= link_to school.identifier.to_s, statistics_college_path(school.identifier), target: '_blank' %>
<% else %>
--
<% end %>

View File

@ -38,6 +38,7 @@
<li><%= sidebar_item(admins_cooperatives_path, '合作伙伴', icon: 'handshake-o', controller: 'admins-cooperatives') %></li>
<li><%= sidebar_item(edit_admins_agreement_path, '服务协议', icon: 'file-text-o', controller: 'admins-agreements') %></li>
<li><%= sidebar_item(edit_admins_help_center_path, '帮助中心', icon: 'question-circle-o', controller: 'admins-help_centers') %></li>
<li><%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs') %></li>
<% end %>
</li>
<li>

View File

@ -0,0 +1,6 @@
json.organizations @organizations do |organization|
json.id organization.id
json.name organization.login
json.nickname organization.nickname.blank? ? organization.name : organization.nickname
json.avatar_url url_to_avatar(organization)
end

View File

@ -21,7 +21,7 @@ json.versions_count @project.versions_count #里程碑数量
json.version_releases_count @project.releases_size(@user.try(:id), "all")
json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本
json.permission render_permission(@user, @project)
json.mirror_url @project&.repository.source_clone_url
json.mirror_url @project&.repository.remote_mirror_url
json.mirror @project&.repository.mirror_url.present?
json.type @project.numerical_for_project_type
json.open_devops @project.open_devops?

View File

@ -130,6 +130,7 @@ Rails.application.routes.draw do
get :search
end
end
get :recommend, on: :collection
end
end
@ -603,6 +604,10 @@ Rails.application.routes.draw do
end
end
# Project Area END
scope module: :helps do
resources :faqs, only: [:index]
end
end
namespace :admins do
@ -779,6 +784,7 @@ Rails.application.routes.draw do
post :drag, on: :collection
post :replace_image_url, on: :member
end
resources :faqs
resources :laboratories, only: [:index, :create, :destroy, :update] do
member do
get :shixuns_for_select

View File

@ -0,0 +1,10 @@
class CreateFaqs < ActiveRecord::Migration[5.2]
def change
create_table :faqs do |t|
t.string :question
t.string :url
t.timestamps
end
end
end