diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 411481f0e..d81b3abb3 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -308,7 +308,7 @@ class ApplicationController < ActionController::Base
 		end
 
 		if !User.current.logged? && Rails.env.development?
-			User.current = User.find 1
+			User.current = User.find 8686
 		end
 
 
diff --git a/app/controllers/weapps/courses_controller.rb b/app/controllers/weapps/courses_controller.rb
index 357b2a503..bef1ca9ac 100644
--- a/app/controllers/weapps/courses_controller.rb
+++ b/app/controllers/weapps/courses_controller.rb
@@ -1,8 +1,8 @@
 class Weapps::CoursesController < Weapps::BaseController
   before_action :require_login
-  before_action :set_course, except: [:create]
-  before_action :user_course_identity, except: [:basic_info, :create]
-  before_action :check_account, only: [:create]
+  before_action :set_course, except: [:create, :check_invite_code]
+  before_action :user_course_identity, except: [:basic_info, :create, :check_invite_code]
+  before_action :check_account, only: [:create, :check_invite_code]
   before_action :teacher_allowed, only: [:edit, :update]
   before_action :teacher_or_admin_allowed, only: [:change_member_roles, :delete_course_teachers]
 
@@ -38,6 +38,23 @@ class Weapps::CoursesController < Weapps::BaseController
     @categories = current_course.shixun_course_modules.first&.course_second_categories
   end
 
+  def check_invite_code
+    tip_exception(-1, "邀请码不能为空") if params[:invite_code].blank?
+    invite_code = params[:invite_code]
+    course = Course.find_by(invite_code: invite_code, is_delete: 0, invite_code_halt: 0)
+    course_group = CourseGroup.find_by(invite_code: invite_code)
+    if course.blank?
+      tip_exception(-1, "邀请码无效") if course_group.blank?
+
+      course = Course.find_by(id: course_group.course_id, is_delete: 0, invite_code_halt: 0)
+      tip_exception(-1, "邀请码无效") if course.blank?
+    end
+
+    tip_exception(-1, "课堂已结束,无法加入") if course.is_end
+
+    render_ok
+  end
+
   # 教师列表
   def teachers
     @course = current_course
@@ -184,11 +201,11 @@ class Weapps::CoursesController < Weapps::BaseController
   private
 
   def course_params
-    params.permit(:name, :course_list_name, :credit, course_module_types: [])
+    params.permit(:name, :course_list_name, :credit, :end_date, course_module_types: [])
   end
 
   def update_course_params
-    params.permit(:name, :course_list_name, :credit)
+    params.permit(:name, :course_list_name, :credit, :end_date)
   end
 
   def current_course
diff --git a/app/forms/item_banks/save_item_form.rb b/app/forms/item_banks/save_item_form.rb
index b10835266..25e5a289a 100644
--- a/app/forms/item_banks/save_item_form.rb
+++ b/app/forms/item_banks/save_item_form.rb
@@ -7,8 +7,6 @@ class ItemBanks::SaveItemForm
   validates :sub_discipline_id, presence: 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, too_long: "不能超过1000个字符" }
-  validates :analysis, length: { maximum: 1000, too_long: "不能超过1000个字符" }
 
   def validate!
     super
@@ -27,7 +25,6 @@ class ItemBanks::SaveItemForm
 
     attr_accessor :choice_text, :is_answer
 
-    validates :choice_text, presence: true, length: { maximum: 500, too_long: "不能超过500个字符" }
     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/forms/weapps/create_course_form.rb b/app/forms/weapps/create_course_form.rb
index 9244096ab..64d0a506f 100644
--- a/app/forms/weapps/create_course_form.rb
+++ b/app/forms/weapps/create_course_form.rb
@@ -2,7 +2,7 @@ class Weapps::CreateCourseForm
   include ActiveModel::Model
 
   attr_accessor :course
-  attr_accessor :name, :course_list_name, :credit, :course_module_types
+  attr_accessor :name, :course_list_name, :credit, :course_module_types, :end_date
 
   validates :name, presence: true
   validates :course_list_name, presence: true
diff --git a/app/forms/weapps/update_course_form.rb b/app/forms/weapps/update_course_form.rb
index 6fb1d81d9..60509dd1d 100644
--- a/app/forms/weapps/update_course_form.rb
+++ b/app/forms/weapps/update_course_form.rb
@@ -2,7 +2,7 @@ class Weapps::UpdateCourseForm
   include ActiveModel::Model
 
   attr_accessor :course
-  attr_accessor :name, :course_list_name, :credit
+  attr_accessor :name, :course_list_name, :credit, :end_date
 
   validates :name, presence: true
   validates :course_list_name, presence: true
diff --git a/app/models/item_analysis.rb b/app/models/item_analysis.rb
index dc1453982..e7177c2f8 100644
--- a/app/models/item_analysis.rb
+++ b/app/models/item_analysis.rb
@@ -1,3 +1,4 @@
 class ItemAnalysis < ApplicationRecord
   belongs_to :item_bank, touch: true
+  validates :analysis, length: { maximum: 5000, too_long: "不能超过5000个字符" }
 end
diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb
index 242b7de92..71cfd07a4 100644
--- a/app/models/item_bank.rb
+++ b/app/models/item_bank.rb
@@ -13,6 +13,7 @@ class ItemBank < ApplicationRecord
   has_many :tag_disciplines, through: :tag_discipline_containers
 
   belongs_to :container, polymorphic: true, optional: true
+  validates :name, presence: true, length: { maximum: 1000, too_long: "不能超过1000个字符" }
 
   def analysis
     item_analysis&.analysis
diff --git a/app/models/item_choice.rb b/app/models/item_choice.rb
index 2b2b08c9d..adee69f66 100644
--- a/app/models/item_choice.rb
+++ b/app/models/item_choice.rb
@@ -1,3 +1,5 @@
 class ItemChoice < ApplicationRecord
   belongs_to :item_bank, touch: true
+  validates :choice_text, presence: true, length: { maximum: 500, too_long: "不能超过500个字符" }
+
 end
diff --git a/app/services/weapps/create_course_service.rb b/app/services/weapps/create_course_service.rb
index 196533bb6..2e5cc5d2f 100644
--- a/app/services/weapps/create_course_service.rb
+++ b/app/services/weapps/create_course_service.rb
@@ -14,6 +14,7 @@ class Weapps::CreateCourseService < ApplicationService
       course.school_id = course.teacher&.school_id
       course.is_public = 0
       course.credit = params[:credit].blank? ? nil : params[:credit]
+      course.end_date = params[:end_date].blank? ? nil : params[:end_date]
       course_list = CourseList.find_by(name: params[:course_list_name].to_s.strip)
       if course_list
         course.course_list_id = course_list.id
@@ -21,6 +22,8 @@ class Weapps::CreateCourseService < ApplicationService
         new_course_list = CourseList.create!(name: params[:course_list_name].to_s.strip, user_id: course.tea_id, is_admin: 0)
         course.course_list_id = new_course_list.id
       end
+      course.is_end = course.end_date.present? && course.end_date < Date.today
+
       course.save!
 
       course.generate_invite_code
diff --git a/app/services/weapps/update_course_service.rb b/app/services/weapps/update_course_service.rb
index 0395a53ad..b6663bc73 100644
--- a/app/services/weapps/update_course_service.rb
+++ b/app/services/weapps/update_course_service.rb
@@ -12,6 +12,7 @@ class Weapps::UpdateCourseService < ApplicationService
     ActiveRecord::Base.transaction do
       course.name = params[:name].to_s.strip
       course.credit = params[:credit].blank? ? nil : params[:credit]
+      course.end_date = params[:end_date].blank? ? nil : params[:end_date]
       course_list = CourseList.find_by(name: params[:course_list_name].to_s.strip)
       if course_list
         course.course_list_id = course_list.id
@@ -19,6 +20,7 @@ class Weapps::UpdateCourseService < ApplicationService
         new_course_list = CourseList.create!(name: params[:course_list_name].to_s.strip, user_id: course.tea_id, is_admin: 0)
         course.course_list_id = new_course_list.id
       end
+      course.is_end = course.end_date.present? && course.end_date < Date.today
       course.save!
     end
     course
diff --git a/app/views/weapps/courses/edit.json.jbuilder b/app/views/weapps/courses/edit.json.jbuilder
index ef7a28a42..1b7d5aaa2 100644
--- a/app/views/weapps/courses/edit.json.jbuilder
+++ b/app/views/weapps/courses/edit.json.jbuilder
@@ -1,2 +1,2 @@
-json.(@course, :id, :name, :credit)
+json.(@course, :id, :name, :credit, :end_date)
 json.course_list_name @course.course_list&.name
\ No newline at end of file
diff --git a/app/views/weapps/homes/show.json.jbuilder b/app/views/weapps/homes/show.json.jbuilder
index 089c70dbb..f307d64fe 100644
--- a/app/views/weapps/homes/show.json.jbuilder
+++ b/app/views/weapps/homes/show.json.jbuilder
@@ -18,11 +18,13 @@ end
 
 json.course_count @course_count
 json.courses @courses.each do |course|
-  json.(course, :id, :name, :visits, :course_members_count)
+  json.(course, :id, :name, :visits, :course_members_count, :is_end, :invite_code_halt)
   json.creator course.teacher.real_name
   json.avatar_url url_to_avatar(course.teacher)
+  json.invite_code course.invite_code_halt == 0 ? course.generate_invite_code : ""
   json.school course.school&.name
   course_member = @category == "study" ? course.students.where(user_id: @user.id).first : course.teachers.where(user_id: @user.id).first
   json.sticky course_member.sticky
+  json.course_identity current_user.course_identity(course)
 end
 
diff --git a/config/routes.rb b/config/routes.rb
index 4e6d26de3..3df8a96da 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1043,6 +1043,10 @@ Rails.application.routes.draw do
           get :course_groups
           get :basic_info
         end
+
+        collection do
+          get :check_invite_code
+        end
       end
 
       resources :homework_commons do
diff --git a/public/images/educoder/xcx/pathsbanner.png b/public/images/educoder/xcx/pathsbanner.png
new file mode 100644
index 000000000..1023b49d5
Binary files /dev/null and b/public/images/educoder/xcx/pathsbanner.png differ
diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js
index 4667ebbde..a3c081285 100644
--- a/public/react/src/AppConfig.js
+++ b/public/react/src/AppConfig.js
@@ -46,7 +46,7 @@ if (isDev) {
 // 老师
 //debugType="teacher";
 // 学生
-debugType="student";
+//debugType="student";
 
 
 
diff --git a/public/react/src/common/components/form/City.js b/public/react/src/common/components/form/City.js
index a94fef765..5ee0c080b 100644
--- a/public/react/src/common/components/form/City.js
+++ b/public/react/src/common/components/form/City.js
@@ -542,6 +542,9 @@ const options = [{
   children: [{
     value: "南宁",
     label: '南宁'
+  },{
+    value: "来宾",
+    label: '来宾'
   },{
     value: '百色',
     label: '百色'
@@ -810,6 +813,9 @@ const options = [{
   children: [{
     value: "武汉",
     label: '武汉'
+  },{
+    value: "天门",
+    label: '天门'
   },{
     value: '恩施',
     label: '恩施'
@@ -1626,6 +1632,9 @@ const options = [{
   children: [{
     value: "杭州",
     label: '杭州'
+  },{
+    value: "温州",
+    label: '温州'
   },{
     value: '安吉',
     label: '安吉'