From d9dfe81a9e819d9da2d41cb57d674eff894c6605 Mon Sep 17 00:00:00 2001
From: 44323 <443237572@qq.com>
Date: 星期二, 05 九月 2023 11:36:21 +0800
Subject: [PATCH] 场地类型管理、场地管理、课包类型管理、教练管理、教练类型管理、福利视频分类管理、体测预约

---
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java                 |   10 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java                         |   35 
 cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java                                                    |    3 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html                              |   79 
 cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java                                              |    5 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html                               |   91 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java                       |  107 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java |  115 
 .idea/misc.xml                                                                                                         |    8 
 cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java                                                       |  111 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java          |   19 
 cloud-server-other/src/main/resources/mapper/StoreMapper.xml                                                           |    6 
 .idea/workspace.xml                                                                                                    |  733 +-
 cloud-server-account/mb-cloud-account.iml                                                                              |  183 
 cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java                                    |    4 
 cloud-server-other/src/main/resources/mapper/SiteMapper.xml                                                            |   72 
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java                             |   17 
 cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js              |  426 +
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java               |   51 
 cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java                                    |   11 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java                        |   63 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html          |  133 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java    |  127 
 cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js                              |  361 +
 cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java                                          |  105 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java             |   75 
 cloud-server-management/src/main/webapp/static/js/common/ajax-object.js                                                |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java               |   44 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html                                      |   62 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js                   |  318 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html                         |  124 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html                   |   33 
 cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java                                |   20 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java                                 |  112 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java                   |   24 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java                        |   40 
 .idea/compiler.xml                                                                                                     |    6 
 cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js                                       |   79 
 cloud-server-activity/mb-cloud-activity.iml                                                                            |  162 
 cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java                              |   45 
 cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js                                           |  614 ++
 cloud-server-course/pom.xml                                                                                            |    5 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java                    |   69 
 cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java                                      |   24 
 cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js                         |  350 +
 cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js                                 |  297 +
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java              |   11 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java                              |   20 
 cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java                            |   89 
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java                     |    8 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html                                      |  207 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java               |    6 
 cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java                                     |   12 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java         |  221 
 cloud-server-management/pom.xml                                                                                        |    4 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java                       |   22 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java                    |   26 
 cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java                                       |   36 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java                                  |   16 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java               |    6 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html                                      |    3 
 cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java                                   |   11 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html                                     |  233 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java                                        |    3 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java                          |   37 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java                             |   45 
 cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml                                         |   33 
 cloud-server-account/pom.xml                                                                                           |    4 
 cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java                               |   51 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java                                 |   49 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html                               |   12 
 cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js                                   |    3 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html              |   79 
 cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java                                   |   11 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java                        |   26 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java                                   |   49 
 cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java                                       |   18 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html                                    |    1 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java                |   11 
 cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html                                                |   21 
 cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java                              |   13 
 cloud-server-account/src/main/resources/mapper/CoachMapper.xml                                                         |   35 
 cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java                             |   33 
 .idea/encodings.xml                                                                                                    |   13 
 cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java                                 |   91 
 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java                                   |   19 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java        |   34 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java                             |  116 
 cloud-server-other/pom.xml                                                                                             |    6 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java              |    4 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java                            |    1 
 cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java                                       |   91 
 cloud-server-activity/pom.xml                                                                                          |    5 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java                                |    3 
 cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java                           |   16 
 cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java                  |    8 
 cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java                               |   16 
 cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java                                                  |   12 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java                              |   36 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java                   |   20 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html                                    |   71 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html                                       |  247 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html         |   91 
 cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml                                                        |    5 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html                                    |  227 
 cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java                                |   21 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java                 |  243 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html                                |   13 
 cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java                                      |  103 
 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java                                   |   11 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java                 |    7 
 cloud-server-auth/mb-cloud-auth.iml                                                                                    |    4 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html                         |  233 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html                                |   86 
 cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java                                           |    6 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java                     |   70 
 cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js                                    |  340 +
 cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java                                     |   55 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java                           |   91 
 cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java                              |   56 
 cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java                                             |    6 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java                         |   25 
 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java                                       |   14 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java                  |   33 
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java                                      |   22 
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java                                  |    5 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java                      |    1 
 cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js                          |  393 +
 cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js                                      |  701 +-
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java                 |  727 +-
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html                                           |    1 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html                                         |   80 
 cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java                                     |   39 
 cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java                                           |    7 
 cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml                                  |   27 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html                                           |   59 
 cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java                                          |   57 
 cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java                                         |   42 
 cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js         |  350 +
 cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java                             |   12 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java        |   12 
 cloud-server-other/src/main/java/com/dsh/other/entity/Site.java                                                        |    3 
 .idea/vcs.xml                                                                                                          |    1 
 .idea/modules.xml                                                                                                      |    2 
 cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js                                            |    1 
 cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js                                         |  527 ++
 cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js                                    |  393 +
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java                    |   21 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java                              |   37 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java                                     |  139 
 cloud-server-course/src/main/resources/mapper/TCourseMapper.xml                                                        |   34 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java                                |   50 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java                          |   18 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java       |   50 
 cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js                                     |  471 +
 cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java                                 |   40 
 cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java                                           |    8 
 cloud-server-competition/pom.xml                                                                                       |    4 
 cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java                                  |   26 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java                                  |   20 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html                          |  104 
 cloud-server-gateway/pom.xml                                                                                           |    5 
 cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java                                               |    4 
 cloud-server-course/mb-cloud-course.iml                                                                                |   10 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html                               |    9 
 cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java                                |    9 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java                                     |    3 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java                                |   13 
 cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java                                                 |   13 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java                        |   11 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java                           |    7 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java                           |   79 
 cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java                                           |    7 
 cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java                                             |    8 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java                            |    6 
 /dev/null                                                                                                              |  327 -
 cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java                    |  101 
 cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java                                                   |    3 
 cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml                                               |    8 
 cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java                                               |    3 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java                          |   52 
 cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java                                         |   97 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java          |   16 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html                                 |   33 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java                              |    1 
 185 files changed, 13,074 insertions(+), 1,629 deletions(-)

diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 4aac1ca..1048eab 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -8,10 +8,11 @@
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
         <module name="mb-cloud-account" />
+        <module name="mb-cloud-gateway" />
         <module name="mb-cloud-course" />
         <module name="mb-cloud-management" />
-        <module name="mb-cloud-competition (1)" />
         <module name="mb-cloud-activity" />
+        <module name="mb-cloud-other" />
         <module name="mb-cloud-competition" />
         <module name="mb-cloud-auth" />
       </profile>
@@ -21,9 +22,10 @@
       <module name="mb-cloud-activity" target="1.8" />
       <module name="mb-cloud-auth" target="1.8" />
       <module name="mb-cloud-competition" target="1.8" />
-      <module name="mb-cloud-competition (1)" target="1.8" />
       <module name="mb-cloud-course" target="1.8" />
+      <module name="mb-cloud-gateway" target="1.8" />
       <module name="mb-cloud-management" target="1.8" />
+      <module name="mb-cloud-other" target="1.8" />
       <module name="mb-cloud-parent" target="1.8" />
     </bytecodeTargetLevel>
   </component>
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 4da5718..e49cf54 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -2,22 +2,13 @@
 <project version="4">
   <component name="Encoding">
     <file url="file://$PROJECT_DIR$/cloud-server-account" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-account/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-account/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-activity" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-activity/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-activity/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-auth" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-auth/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-auth/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-competition" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-competition/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-competition/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-course" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-course/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-course/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/cloud-server-gateway" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-management" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/cloud-server-management/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/cloud-server-other" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/cloud-server-parent" charset="UTF-8" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 9fdbe42..77717a2 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -6,13 +6,15 @@
   <component name="MavenProjectsManager">
     <option name="originalFiles">
       <list>
-        <option value="$PROJECT_DIR$/cloud-server-account/pom.xml" />
         <option value="$PROJECT_DIR$/cloud-server-parent/pom.xml" />
+        <option value="$PROJECT_DIR$/cloud-server-other/pom.xml" />
         <option value="$PROJECT_DIR$/cloud-server-management/pom.xml" />
+        <option value="$PROJECT_DIR$/cloud-server-gateway/pom.xml" />
+        <option value="$PROJECT_DIR$/cloud-server-course/pom.xml" />
+        <option value="$PROJECT_DIR$/cloud-server-competition/pom.xml" />
         <option value="$PROJECT_DIR$/cloud-server-auth/pom.xml" />
         <option value="$PROJECT_DIR$/cloud-server-activity/pom.xml" />
-        <option value="$PROJECT_DIR$/cloud-server-competition/pom.xml" />
-        <option value="$PROJECT_DIR$/cloud-server-course/pom.xml" />
+        <option value="$PROJECT_DIR$/cloud-server-account/pom.xml" />
       </list>
     </option>
   </component>
diff --git a/.idea/modules.xml b/.idea/modules.xml
index c90d342..1229991 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -8,7 +8,9 @@
       <module fileurl="file://$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" filepath="$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" />
       <module fileurl="file://$PROJECT_DIR$/cloud-server-competition/mb-cloud-competition.iml" filepath="$PROJECT_DIR$/cloud-server-competition/mb-cloud-competition.iml" />
       <module fileurl="file://$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" filepath="$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" />
+      <module fileurl="file://$PROJECT_DIR$/cloud-server-gateway/mb-cloud-gateway.iml" filepath="$PROJECT_DIR$/cloud-server-gateway/mb-cloud-gateway.iml" />
       <module fileurl="file://$PROJECT_DIR$/cloud-server-management/mb-cloud-management.iml" filepath="$PROJECT_DIR$/cloud-server-management/mb-cloud-management.iml" />
+      <module fileurl="file://$PROJECT_DIR$/cloud-server-other/mb-cloud-other.iml" filepath="$PROJECT_DIR$/cloud-server-other/mb-cloud-other.iml" />
       <module fileurl="file://$PROJECT_DIR$/cloud-server-parent/mb-cloud-parent.iml" filepath="$PROJECT_DIR$/cloud-server-parent/mb-cloud-parent.iml" />
     </modules>
   </component>
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index a0e52a0..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,6 +2,5 @@
 <project version="4">
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Git" />
-    <mapping directory="$PROJECT_DIR$/cloud-server-parent" vcs="Git" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index f2ab91c..15613af 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,39 +1,200 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="BranchesTreeState">
-    <expand>
-      <path>
-        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
-        <item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
-      </path>
-      <path>
-        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
-        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
-      </path>
-      <path>
-        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
-        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
-        <item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
-      </path>
-    </expand>
-    <select />
-  </component>
   <component name="ChangeListManager">
-    <list default="true" id="cb08d02f-fd4f-4fa2-85fe-abd508fa83ac" name="Default Changelist" comment="后台代码">
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js" afterDir="false" />
+    <list default="true" id="f560b179-9233-4e76-92e7-a3f41cf84d9f" name="Default Changelist" comment="">
+      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-account/mb-cloud-account.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/mb-cloud-account.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/TCityManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/TCityManager.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/resources/mapper/CoachMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/resources/mapper/CoachMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-activity/mb-cloud-activity.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/mb-cloud-activity.iml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/model/Store.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/model/Store.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-competition/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-competition/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-gateway/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-gateway/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity_add.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity_add.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCar/tCar_info.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCar/tCar_info.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_add.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_edit.html" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_img.html" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_imgAll.html" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/electricFence.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/HonorDeClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/HonorDeClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/SiteClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/SiteClient.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/StoreMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/StoreMapper.xml" afterDir="false" />
     </list>
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -42,37 +203,18 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
-        <option value="Interface" />
+        <option value="HTML File" />
         <option value="Class" />
+        <option value="mybatis-mapper" />
       </list>
     </option>
   </component>
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
-  <component name="JsFlowSettings">
-    <service-enabled>true</service-enabled>
-    <exe-path />
-    <other-services-enabled>true</other-services-enabled>
-    <auto-save>true</auto-save>
-  </component>
-  <component name="MavenImportPreferences">
-    <option name="generalSettings">
-      <MavenGeneralSettings>
-        <option name="mavenHome" value="D:/apache-maven/apache-maven-3.6.1" />
-        <option name="userSettingsFile" value="D:\apache-maven\apache-maven-3.6.1\conf\settings.xml" />
-      </MavenGeneralSettings>
-    </option>
-  </component>
-  <component name="ProjectId" id="2T0poWYlZShlnPso29uxjn4gQQo" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
-    <ConfirmationsSetting value="1" id="Add" />
-  </component>
-  <component name="ProjectViewState">
-    <option name="hideEmptyMiddlePackages" value="true" />
-    <option name="showLibraryContents" value="true" />
-  </component>
+  <component name="ProjectId" id="2Tjw32TibW9vX8W0bRu35zUVftR" />
   <component name="PropertiesComponent">
+    <property name="DefaultHtmlFileTemplate" value="HTML File" />
     <property name="ExpandSpringBootJavaOptionsPanel" value="true" />
     <property name="RequestMappingsPanelOrder0" value="0" />
     <property name="RequestMappingsPanelOrder1" value="1" />
@@ -80,33 +222,28 @@
     <property name="RequestMappingsPanelWidth1" value="75" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1686656087610" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system" />
-    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
-    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
-    <property name="project.structure.last.edited" value="Global Libraries" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment" />
+    <property name="nodejs_package_manager_path" value="npm" />
+    <property name="project.structure.last.edited" value="Modules" />
     <property name="project.structure.proportion" value="0.0" />
     <property name="project.structure.side.proportion" value="0.2" />
-    <property name="run.code.analysis.last.selected.profile" value="pProject Default" />
-    <property name="settings.editor.selected.configurable" value="project.propVCSSupport.Mappings" />
-  </component>
-  <component name="ReactorSettings">
-    <option name="notificationShown" value="true" />
+    <property name="restartRequiresConfirmation" value="false" />
+    <property name="settings.editor.selected.configurable" value="MavenSettings" />
   </component>
   <component name="RecentsManager">
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.dsh.course.feignClient.account.model" />
-      <recent name="com.dsh.account.mapper" />
-      <recent name="com.dsh.account.service.impl" />
-      <recent name="com.dsh.account.service" />
-      <recent name="com.dsh.account.controller" />
+      <recent name="com.dsh.activity.feignclient.other.model" />
+      <recent name="com.dsh.course.feignClient.activity" />
+      <recent name="com.dsh.guns.modular.system.controller.code" />
+      <recent name="com.dsh.course.feignClient.activity.model" />
+      <recent name="com.dsh.activity.model" />
     </key>
     <key name="CopyFile.RECENT_KEYS">
-      <recent name="F:\code\PlayPai\cloud-server-management\src\main\webapp\static\modular\system" />
-      <recent name="F:\code\PlayPai\cloud-server-account\src\main\resources\mapper" />
-      <recent name="F:\code\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system" />
-      <recent name="F:\code\PlayPai\cloud-server-competition\src\main\java\com\dsh" />
-      <recent name="F:\code\PlayPai\cloud-server-management\src\main\resources\mapper" />
+      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system\bodySideAppointment" />
+      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\static\modular\system\bodySideAppointment" />
+      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\java\com\dsh\course\feignClient\activity\model" />
+      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\static\modular\system\benefits" />
+      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system\benefits" />
     </key>
   </component>
   <component name="RunDashboard">
@@ -115,8 +252,18 @@
         <option value="SpringBootApplicationConfigurationType" />
       </set>
     </option>
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
   </component>
-  <component name="RunManager" selected="Spring Boot.AccountApplication">
+  <component name="RunManager" selected="Spring Boot.ManagementApplication">
     <configuration name="AccountApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-account" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.AccountApplication" />
@@ -126,17 +273,11 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="AccountApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-account" />
-      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.AccountApplication" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
-    </configuration>
     <configuration name="ActivityApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-activity" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.ActivityApplication" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
@@ -158,8 +299,17 @@
       </method>
     </configuration>
     <configuration name="CourseApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-competition (1)" />
+      <module name="mb-cloud-course" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.CourseApplication" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="GatewayApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="mb-cloud-gateway" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="cn.mb.cloud.gateway.GatewayApplication" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
@@ -167,380 +317,153 @@
     <configuration name="ManagementApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-management" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.ManagementApplication" />
-      <option name="ENABLE_JMX_AGENT" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="UserApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-user" />
-      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.UserApplication" />
+    <configuration name="OtherApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="mb-cloud-other" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.OtherApplication" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
     <list>
-      <item itemvalue="Spring Boot.UserApplication" />
-      <item itemvalue="Spring Boot.ManagementApplication" />
-      <item itemvalue="Spring Boot.AuthApplication" />
       <item itemvalue="Spring Boot.AccountApplication" />
       <item itemvalue="Spring Boot.ActivityApplication" />
+      <item itemvalue="Spring Boot.AuthApplication" />
       <item itemvalue="Spring Boot.CompetitionApplication" />
       <item itemvalue="Spring Boot.CourseApplication" />
+      <item itemvalue="Spring Boot.GatewayApplication" />
+      <item itemvalue="Spring Boot.ManagementApplication" />
+      <item itemvalue="Spring Boot.OtherApplication" />
     </list>
+  </component>
+  <component name="ServiceViewManager">
+    <option name="allServicesViewState">
+      <serviceView>
+        <treeState>
+          <expand>
+            <path>
+              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
+              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
+            </path>
+            <path>
+              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
+              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
+              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@872283ff" type="7427dc5b:ServiceModel$ServiceGroupNode" />
+            </path>
+            <path>
+              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
+              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
+              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@69458c78" type="7427dc5b:ServiceModel$ServiceGroupNode" />
+            </path>
+          </expand>
+          <select />
+        </treeState>
+      </serviceView>
+    </option>
   </component>
   <component name="SvnConfiguration">
     <configuration />
   </component>
   <component name="TaskManager">
     <task active="true" id="Default" summary="Default task">
-      <changelist id="cb08d02f-fd4f-4fa2-85fe-abd508fa83ac" name="Default Changelist" comment="" />
-      <created>1686653431962</created>
+      <changelist id="f560b179-9233-4e76-92e7-a3f41cf84d9f" name="Default Changelist" comment="" />
+      <created>1691569594609</created>
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
-      <updated>1686653431962</updated>
-      <workItem from="1686653433491" duration="2267000" />
-      <workItem from="1690190039038" duration="16883000" />
-      <workItem from="1690333209172" duration="26986000" />
+      <updated>1691569594609</updated>
+      <workItem from="1691569596751" duration="65000" />
+      <workItem from="1691569675100" duration="270000" />
+      <workItem from="1691569964197" duration="5608000" />
+      <workItem from="1691628065563" duration="26776000" />
+      <workItem from="1691714824948" duration="32278000" />
+      <workItem from="1691752453575" duration="55000" />
+      <workItem from="1691974807017" duration="29112000" />
+      <workItem from="1692060742194" duration="20502000" />
+      <workItem from="1692087400805" duration="8025000" />
+      <workItem from="1692146436177" duration="23500000" />
+      <workItem from="1692233067279" duration="10090000" />
+      <workItem from="1692252017276" duration="7536000" />
+      <workItem from="1692260089826" duration="8503000" />
+      <workItem from="1692319933611" duration="26839000" />
+      <workItem from="1692578769161" duration="28170000" />
+      <workItem from="1692665038696" duration="13077000" />
+      <workItem from="1692684619085" duration="13291000" />
+      <workItem from="1692751172028" duration="28054000" />
+      <workItem from="1692837854502" duration="6293000" />
+      <workItem from="1692844552907" duration="8241000" />
+      <workItem from="1692859160967" duration="13015000" />
+      <workItem from="1692924469163" duration="21622000" />
+      <workItem from="1692954633621" duration="995000" />
+      <workItem from="1692955658907" duration="4758000" />
+      <workItem from="1693183363744" duration="30378000" />
+      <workItem from="1693269664223" duration="20846000" />
+      <workItem from="1693296305848" duration="948000" />
+      <workItem from="1693297281055" duration="121000" />
+      <workItem from="1693297534980" duration="7686000" />
+      <workItem from="1693356090840" duration="27477000" />
+      <workItem from="1693442643841" duration="24243000" />
+      <workItem from="1693528994907" duration="29480000" />
+      <workItem from="1693566786046" duration="243000" />
+      <workItem from="1693567041762" duration="123000" />
+      <workItem from="1693623395574" duration="598000" />
+      <workItem from="1693643198935" duration="776000" />
+      <workItem from="1693705892630" duration="12000" />
+      <workItem from="1693706255970" duration="1688000" />
+      <workItem from="1693879663101" duration="1191000" />
+      <workItem from="1693884719266" duration="158000" />
     </task>
-    <task id="LOCAL-00001" summary="后台代码删除">
-      <created>1690249807612</created>
+    <task id="LOCAL-00001" summary="客服管理、荣誉管理">
+      <created>1692233310670</created>
       <option name="number" value="00001" />
       <option name="presentableId" value="LOCAL-00001" />
       <option name="project" value="LOCAL" />
-      <updated>1690249807612</updated>
+      <updated>1692233310670</updated>
     </task>
-    <task id="LOCAL-00002" summary="后台代码删除">
-      <created>1690254629455</created>
-      <option name="number" value="00002" />
-      <option name="presentableId" value="LOCAL-00002" />
-      <option name="project" value="LOCAL" />
-      <updated>1690254629455</updated>
-    </task>
-    <task id="LOCAL-00003" summary="后台代码删除">
-      <created>1690254749862</created>
-      <option name="number" value="00003" />
-      <option name="presentableId" value="LOCAL-00003" />
-      <option name="project" value="LOCAL" />
-      <updated>1690254749862</updated>
-    </task>
-    <task id="LOCAL-00004" summary="后台代码">
-      <created>1690334274202</created>
-      <option name="number" value="00004" />
-      <option name="presentableId" value="LOCAL-00004" />
-      <option name="project" value="LOCAL" />
-      <updated>1690334274203</updated>
-    </task>
-    <task id="LOCAL-00005" summary="后台代码">
-      <created>1690335913450</created>
-      <option name="number" value="00005" />
-      <option name="presentableId" value="LOCAL-00005" />
-      <option name="project" value="LOCAL" />
-      <updated>1690335913450</updated>
-    </task>
-    <task id="LOCAL-00006" summary="后台代码">
-      <created>1690338179876</created>
-      <option name="number" value="00006" />
-      <option name="presentableId" value="LOCAL-00006" />
-      <option name="project" value="LOCAL" />
-      <updated>1690338179876</updated>
-    </task>
-    <task id="LOCAL-00007" summary="后台代码">
-      <created>1690338325966</created>
-      <option name="number" value="00007" />
-      <option name="presentableId" value="LOCAL-00007" />
-      <option name="project" value="LOCAL" />
-      <updated>1690338325966</updated>
-    </task>
-    <task id="LOCAL-00008" summary="后台代码">
-      <created>1690341067099</created>
-      <option name="number" value="00008" />
-      <option name="presentableId" value="LOCAL-00008" />
-      <option name="project" value="LOCAL" />
-      <updated>1690341067099</updated>
-    </task>
-    <task id="LOCAL-00009" summary="后台代码">
-      <created>1690355617215</created>
-      <option name="number" value="00009" />
-      <option name="presentableId" value="LOCAL-00009" />
-      <option name="project" value="LOCAL" />
-      <updated>1690355617215</updated>
-    </task>
-    <task id="LOCAL-00010" summary="后台代码删除">
-      <created>1690362658673</created>
-      <option name="number" value="00010" />
-      <option name="presentableId" value="LOCAL-00010" />
-      <option name="project" value="LOCAL" />
-      <updated>1690362658673</updated>
-    </task>
-    <task id="LOCAL-00011" summary="后台代码删除">
-      <created>1690363462474</created>
-      <option name="number" value="00011" />
-      <option name="presentableId" value="LOCAL-00011" />
-      <option name="project" value="LOCAL" />
-      <updated>1690363462474</updated>
-    </task>
-    <task id="LOCAL-00012" summary="后台代码">
-      <created>1690364368448</created>
-      <option name="number" value="00012" />
-      <option name="presentableId" value="LOCAL-00012" />
-      <option name="project" value="LOCAL" />
-      <updated>1690364368448</updated>
-    </task>
-    <task id="LOCAL-00013" summary="后台代码">
-      <created>1690364506501</created>
-      <option name="number" value="00013" />
-      <option name="presentableId" value="LOCAL-00013" />
-      <option name="project" value="LOCAL" />
-      <updated>1690364506501</updated>
-    </task>
-    <option name="localTasksCounter" value="14" />
+    <option name="localTasksCounter" value="2" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="2" />
+    <option name="version" value="1" />
   </component>
   <component name="Vcs.Log.Tabs.Properties">
     <option name="TAB_STATES">
       <map>
         <entry key="MAIN">
           <value>
-            <State />
+            <State>
+              <option name="COLUMN_ORDER" />
+            </State>
           </value>
         </entry>
       </map>
     </option>
-    <option name="oldMeFiltersMigrated" value="true" />
   </component>
   <component name="VcsManagerConfiguration">
-    <MESSAGE value="后台代码删除" />
-    <MESSAGE value="后台代码" />
-    <option name="LAST_COMMIT_MESSAGE" value="后台代码" />
-  </component>
-  <component name="WindowStateProjectService">
-    <state x="590" y="80" key="#&lt;template&gt;_of_Spring_Boot" timestamp="1690338437444">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="590" y="80" key="#&lt;template&gt;_of_Spring_Boot/0.0.1920.1032@0.0.1920.1032" timestamp="1690338437444" />
-    <state x="590" y="0" width="753" height="1032" key="#AccountApplication" timestamp="1690363440283">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="590" y="0" width="753" height="1032" key="#AccountApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690363440283" />
-    <state x="590" y="0" width="753" height="1032" key="#CompetitionApplication" timestamp="1690342021698">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="590" y="0" width="753" height="1032" key="#CompetitionApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690342021698" />
-    <state x="590" y="109" width="753" height="813" key="#ManagementApplication" timestamp="1690338483958">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="590" y="109" width="753" height="813" key="#ManagementApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690338483958" />
-    <state x="765" y="199" key="#com.intellij.ide.util.MemberChooser" timestamp="1690351593596">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="765" y="199" key="#com.intellij.ide.util.MemberChooser/0.0.1920.1032@0.0.1920.1032" timestamp="1690351593596" />
-    <state x="689" y="304" key="#com.intellij.ide.util.TreeClassChooserDialog" timestamp="1690338381045">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="689" y="304" key="#com.intellij.ide.util.TreeClassChooserDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690338381045" />
-    <state x="504" y="438" key="#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog" timestamp="1690337455729">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="504" y="438" key="#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690337455729" />
-    <state x="674" y="382" width="571" height="274" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes" timestamp="1690338847091">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="674" y="382" width="571" height="274" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes/0.0.1920.1032@0.0.1920.1032" timestamp="1690338847091" />
-    <state x="703" y="346" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1" timestamp="1690363667225">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="703" y="346" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1/0.0.1920.1032@0.0.1920.1032" timestamp="1690363667225" />
-    <state x="519" y="82" key="CommitChangelistDialog2" timestamp="1690364505261">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="519" y="82" key="CommitChangelistDialog2/0.0.1920.1032@0.0.1920.1032" timestamp="1690364505261" />
-    <state width="464" height="466" key="DebuggerActiveHint" timestamp="1690354723383">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="464" height="466" key="DebuggerActiveHint/0.0.1920.1032@0.0.1920.1032" timestamp="1690354723383" />
-    <state x="740" y="270" key="FileChooserDialogImpl" timestamp="1690249419357">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="740" y="270" key="FileChooserDialogImpl/0.0.1920.1032@0.0.1920.1032" timestamp="1690249419357" />
-    <state width="1293" height="418" key="GridCell.Tab.0.bottom" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.0.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.0.center" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.0.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.0.left" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.0.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.0.right" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.0.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.1.bottom" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.1.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.1.center" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.1.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.1.left" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.1.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.1.right" timestamp="1690366694918">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.1.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
-    <state width="1293" height="418" key="GridCell.Tab.2.bottom" timestamp="1690366555269">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.2.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
-    <state width="1293" height="418" key="GridCell.Tab.2.center" timestamp="1690366555269">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.2.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
-    <state width="1293" height="418" key="GridCell.Tab.2.left" timestamp="1690366555269">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.2.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
-    <state width="1293" height="418" key="GridCell.Tab.2.right" timestamp="1690366555269">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state width="1293" height="418" key="GridCell.Tab.2.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
-    <state x="461" y="160" key="SettingsEditor" timestamp="1690191509088">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="461" y="160" key="SettingsEditor/0.0.1920.1032@0.0.1920.1032" timestamp="1690191509088" />
-    <state x="552" y="248" key="Vcs.Push.Dialog.v2" timestamp="1690364507500">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="552" y="248" key="Vcs.Push.Dialog.v2/0.0.1920.1032@0.0.1920.1032" timestamp="1690364507500" />
-    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog" timestamp="1690340014123">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690340014123" />
-    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.FileHistoryDialog" timestamp="1690340014123">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.FileHistoryDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690340014123" />
-    <state x="754" y="428" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2" timestamp="1690362660961">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="754" y="428" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2/0.0.1920.1032@0.0.1920.1032" timestamp="1690362660961" />
-    <state x="661" y="224" width="721" height="584" key="find.popup" timestamp="1690365779184">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="661" y="224" width="721" height="584" key="find.popup/0.0.1920.1032@0.0.1920.1032" timestamp="1690365779184" />
-    <state x="623" y="223" width="672" height="678" key="search.everywhere.popup" timestamp="1690365810397">
-      <screen x="0" y="0" width="1920" height="1032" />
-    </state>
-    <state x="623" y="223" width="672" height="678" key="search.everywhere.popup/0.0.1920.1032@0.0.1920.1032" timestamp="1690365810397" />
+    <MESSAGE value="客服管理、荣誉管理" />
+    <option name="LAST_COMMIT_MESSAGE" value="客服管理、荣誉管理" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
       <breakpoints>
         <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java</url>
-          <line>145</line>
-          <option name="timeStamp" value="1" />
+          <url>file://$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java</url>
+          <line>148</line>
+          <option name="timeStamp" value="3" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java</url>
+          <line>88</line>
+          <option name="timeStamp" value="43" />
         </line-breakpoint>
       </breakpoints>
     </breakpoint-manager>
-  </component>
-  <component name="masterDetails">
-    <states>
-      <state key="ArtifactsStructureConfigurable.UI">
-        <settings>
-          <artifact-editor />
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="FacetStructureConfigurable.UI">
-        <settings>
-          <last-edited>No facets are configured</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="GlobalLibrariesConfigurable.UI">
-        <settings>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="JdkListConfigurable.UI">
-        <settings>
-          <last-edited>1.8</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="ModuleStructureConfigurable.UI">
-        <settings>
-          <last-edited>PlayPai</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-                <option value="0.6" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="ProjectJDKs.UI">
-        <settings>
-          <last-edited>1.8</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="ProjectLibrariesConfigurable.UI">
-        <settings>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-    </states>
+    <watches-manager>
+      <configuration name="SpringBootApplicationConfigurationType">
+        <watch expression="vo.data3" />
+      </configuration>
+    </watches-manager>
   </component>
 </project>
\ No newline at end of file
diff --git a/cloud-server-account/mb-cloud-account.iml b/cloud-server-account/mb-cloud-account.iml
index 9c5ecce..0a6f46a 100644
--- a/cloud-server-account/mb-cloud-account.iml
+++ b/cloud-server-account/mb-cloud-account.iml
@@ -28,7 +28,6 @@
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba:transmittable-thread-local:2.10.1" level="project" />
-    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
     <orderEntry type="library" name="Maven: cn.mb.cloud:mb-cloud-common-data:1.1.3" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.6.RELEASE" level="project" />
@@ -133,6 +132,9 @@
     <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
     <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
@@ -147,19 +149,170 @@
     <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.11.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.22" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.22" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.velocity:velocity:1.7" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.30" level="project" />
+    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
+    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
+    <orderEntry type="library" name="Maven: com.alipay.sdk:alipay-sdk-java:4.38.10.ALL" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83_noneautotype" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.9" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.jettison:jettison:1.2" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-sts:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ecs:4.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.4.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.3" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: org.gavaghan:geodesy:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-jdbc-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-transaction-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-transaction-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-executor:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-mysql-client:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-core:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler-proxy:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-socks:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-http2:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-sql-client:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-sql92:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-engine:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-spi:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-statement:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.antlr:antlr4-runtime:4.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.7.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-mysql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-postgresql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-oracle:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-sqlserver:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-opengauss:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-authority-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-authority-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-single-table-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-single-table-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-route:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-traffic-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-common:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-util:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.groovy:groovy:4.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-binder:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-dialect-exception-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-traffic-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-context:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-distsql-parser:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-distsql-statement:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-schedule-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-lite-core:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-api:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-infra-common:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-registry-center:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-simple-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-executor-kernel:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-error-handler-general:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-error-handler-spi:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-dataflow-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-script-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-http-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-tracing-rdb:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-tracing-api:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-lite-lifecycle:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-jdbc-h2:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-jdbc-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-repository-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-data-pipeline-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-data-pipeline-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-repository-zookeeper-curator:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-framework:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-client:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper-jute:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.yetus:audience-annotations:0.5.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-recipes:2.12.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-rewrite:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-native-provider:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-merge:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite:calcite-linq4j:1.31.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite.avatica:avatica-core:1.22.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite.avatica:avatica-metrics:1.22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.5.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.client5:httpclient5:5.1.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.core5:httpcore5-h2:5.1.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.core5:httpcore5:5.1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-system-datetime:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-datetime-spi:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-cosid:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: me.ahoo.cosid:cosid-core:1.14.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-nanoid:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aventrix.jnanoid:jnanoid:2.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-readwrite-splitting-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-readwrite-splitting-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-mysql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-opengauss:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-sm:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-shadow-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-shadow-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-federation-executor:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-federation-optimizer:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite:calcite-core:1.31.0" level="project" />
+    <orderEntry type="library" name="Maven: com.esri.geometry:esri-geometry-api:2.2.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.uzaygezen:uzaygezen-core:0.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.yahoo.datasketches:sketches-core:0.9.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.yahoo.datasketches:memory:0.9.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.hydromatic:aggdesigner-algorithm:6.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.commons:commons-dbcp2:2.7.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.janino:commons-compiler:3.1.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.janino:janino:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-parser-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-parser-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-parser:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.h2database:h2:1.4.200" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:1.2.1" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-common:1.2.1" level="project" />
     <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
     <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.2.1" level="project" />
-    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.58" level="project" />
-    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.5.0" level="project" />
     <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.6" level="project" />
@@ -170,7 +323,6 @@
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.59" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-archaius:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-archaius:2.2.6.RELEASE" level="project" />
@@ -186,8 +338,6 @@
     <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty:0.4.9" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-core:2.3.0" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-httpclient:2.3.0" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-client:1.19.1" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-core:1.19.1" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: javax.ws.rs:jsr311-api:1.1.1" level="project" />
@@ -207,7 +357,6 @@
     <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
     <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.3.6.RELEASE" level="project" />
@@ -222,10 +371,10 @@
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.3.6.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
@@ -237,7 +386,7 @@
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.6.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
diff --git a/cloud-server-account/pom.xml b/cloud-server-account/pom.xml
index 7be549d..16fac21 100644
--- a/cloud-server-account/pom.xml
+++ b/cloud-server-account/pom.xml
@@ -126,10 +126,6 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
     <repositories>
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java
index 56bb556..66cbc12 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java
@@ -1,10 +1,18 @@
 package com.dsh.account.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.account.entity.CityManager;
+import com.dsh.account.feignclient.other.model.Store;
 import com.dsh.account.service.ICityManagerService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 /**
  * @author zhibing.pu
@@ -19,6 +27,49 @@
 
 
     /**
+     * 根据管理员id获取详情信息
+     */
+    @RequestMapping("/cityManager/getStoreById")
+    public CityManager getStoreById(@RequestParam Integer id){
+        return cityManagerService.getOne(new QueryWrapper<CityManager>().eq("id",id));
+    }
+    /**
+     * 获取已有城市管理的省、市
+     */
+    @RequestMapping("/cityManager/listAll")
+
+    public List<CityManager> listAll(){
+        return cityManagerService.listAll();
+    }
+    /**
+     * 选择省 展示市
+     */
+    @RequestMapping("/cityManager/getCity")
+    @ResponseBody
+    public List<CityManager> getCity(@RequestBody String province){
+        List<CityManager> province1 = cityManagerService.list(new QueryWrapper<CityManager>().eq("province", province));
+        List<CityManager> distinctCities = province1.stream()
+                .collect(Collectors.collectingAndThen(
+                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CityManager::getCity))),
+                        ArrayList::new
+                ));
+
+        return distinctCities;
+    }
+
+    /**
+     * 选择市区 展示全部账号
+     */
+    @RequestMapping("/cityManager/getAccount")
+    @ResponseBody
+    List<CityManager> getAccount(@RequestBody String city){
+        return cityManagerService.list(new QueryWrapper<CityManager>().eq("city",city).ne("state",2).ne("state",3));
+    }
+
+
+
+
+    /**
      * 根据id获取数据
      * @param id
      * @return
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java
index 03bf6a4..0f714f0 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java
@@ -3,6 +3,9 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.account.entity.Coach;
+import com.dsh.account.model.query.coachQuery.CoachQuery;
+import com.dsh.account.model.vo.CoachChangeStateVO;
+import com.dsh.account.model.vo.CoachSerchVO;
 import com.dsh.account.service.CoachService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -16,6 +19,58 @@
     @Autowired
     private CoachService service;
 
+
+    /**
+     * 获取教练列表数据
+     */
+    @ResponseBody
+    @RequestMapping("/coach/listAll")
+    public List<CoachSerchVO> listAll(@RequestBody CoachQuery query){
+        List<CoachSerchVO> coachSerchVOS = service.listAll(query);
+        for (CoachSerchVO coachSerchVO : coachSerchVOS) {
+            coachSerchVO.setNameAndPhone(coachSerchVO.getAccountName()+"-"+coachSerchVO.getAccountPhone());
+        }
+        return coachSerchVOS;
+    }
+    /**
+     * 上/下架、删除常见问题 type=1为上架 2为下架
+     */
+    @RequestMapping("/coach/changeState")
+    public Object changeState(@RequestBody CoachChangeStateVO vo){
+
+        return service.changeState(vo);
+    }
+    /**
+     * 添加教练
+     * @return
+     */
+    @RequestMapping("/base/site/addCoach")
+    public Object addCoach(@RequestBody Coach coach){
+
+        if(coach.getId()!= null ){
+            return service.updateById(coach);
+        }else {
+            return service.save(coach);
+        }
+    }
+    /**
+     * 获取所有省
+     */
+    @ResponseBody
+    @PostMapping("/coach/getProvince")
+    public List<Coach> getProvince(){
+        return service.list();
+    }
+
+    /**
+     * 根据选择的省获取对应的市
+     */
+    @ResponseBody
+    @PostMapping("/coach/getCity")
+    public List<Coach> getCity(@RequestBody String city){
+        return service.list(new QueryWrapper<Coach>().eq("province",city));
+    }
+
     /**
      * 根据门店
      * @param id
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java
new file mode 100644
index 0000000..2f8e59f
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java
@@ -0,0 +1,91 @@
+package com.dsh.account.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.account.entity.Coach;
+import com.dsh.account.entity.CoachType;
+import com.dsh.account.service.CoachService;
+import com.dsh.account.service.CoachTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 教练类型
+ */
+@RestController
+@RequestMapping("")
+public class CoachTypeController {
+
+    @Autowired
+    private CoachService service;
+    @Autowired
+    private CoachTypeService typeService;
+
+    /**
+     * 根据门店
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coachType/list")
+    public List<CoachType> list(){
+
+        return typeService.list(new QueryWrapper<CoachType>().ne("state",3));
+    }
+
+    /**
+     * 新增教练类型
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/coachType/add")
+    public Object add(@RequestBody String name){
+
+        List<CoachType> list = typeService.list(new QueryWrapper<CoachType>().eq("name", name));
+        if (list.size()!= 0){
+            return 500;
+        }else{
+            CoachType coachType = new CoachType();
+            coachType.setName(name);
+            coachType.setState(1);
+            typeService.save(coachType);
+            return 200;
+        }
+    }
+    /**
+     * 删除教练类型
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/coachType/delete")
+    public Object delete(@RequestBody Integer id){
+        CoachType coachType = new CoachType();
+        coachType.setId(id);
+        coachType.setState(3);
+        return typeService.updateById(coachType);
+    }
+
+    /**
+     * 修改教练类型
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/coachType/update")
+    public Object update(@RequestBody CoachType coachType){
+        List<CoachType> list = typeService.list(new QueryWrapper<CoachType>().eq("name", coachType.getName()));
+        if (list.size()!= 0){
+            return 500;
+        }else{
+            typeService.updateById(coachType);
+            return 200;
+
+        }
+
+    }
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java b/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java
index 3eb26f8..cbfa270 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -72,6 +73,7 @@
      * 生日
      */
     @TableField("birthday")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date birthday;
     /**
      * 性别(1=男,2=女)
@@ -127,6 +129,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date insertTime;
 
 
diff --git a/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java b/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java
index bf318f8..ac983cc 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java
@@ -2,6 +2,11 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dsh.account.entity.Coach;
+import com.dsh.account.model.query.coachQuery.CoachQuery;
+import com.dsh.account.model.vo.CoachSerchVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,7 @@
  */
 public interface CoachMapper extends BaseMapper<Coach> {
 
+    List<CoachSerchVO> listAll(@Param("query") CoachQuery query);
+
+    Object changeState(@Param("ids") List<Integer> ids, @Param("state") Integer state);
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java b/cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java
new file mode 100644
index 0000000..b9f2593
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java
@@ -0,0 +1,13 @@
+package com.dsh.account.model.query.coachQuery;
+
+import lombok.Data;
+
+@Data
+public class CoachQuery {
+    private String province;
+    private String city;
+    private String name;
+    private String phone;
+    // 编辑页面回显使用
+    private Integer id;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java
new file mode 100644
index 0000000..64f4364
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java
@@ -0,0 +1,11 @@
+package com.dsh.account.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CoachChangeStateVO {
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java
new file mode 100644
index 0000000..352dd1b
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java
@@ -0,0 +1,105 @@
+package com.dsh.account.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 教练
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-05
+ */
+@Data
+public class CoachSerchVO {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 城市管理员id
+     */
+    private Integer cityManagerId;
+    private String nameAndPhone;
+    private String accountName;
+    private String accountPhone;
+    /**
+     * 教练类型id
+     */
+    private Integer coachTypeId;
+    private String  coachTypeName;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 生日
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+    /**
+     * 性别(1=男,2=女)
+     */
+    private Integer gender;
+    /**
+     * 电话
+     */
+    private String phone;
+    /**
+     * 身份证号码
+     */
+    private String idcard;
+    /**
+     * 身高(厘米)
+     */
+    private Double height;
+    /**
+     * 体重(KG)
+     */
+    private Double weight;
+    /**
+     * 毕业院校
+     */
+    private String graduateSchool;
+    /**
+     * 毕业证照片
+     */
+    private String diploma;
+    /**
+     * 资格证书(多个逗号分隔)
+     */
+    private String certificate;
+    /**
+     * 证书照片
+     */
+    private String certificateImg;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java b/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java
index 72f0772..3e5b8fc 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java
@@ -2,6 +2,11 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.account.entity.Coach;
+import com.dsh.account.model.query.coachQuery.CoachQuery;
+import com.dsh.account.model.vo.CoachChangeStateVO;
+import com.dsh.account.model.vo.CoachSerchVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,7 @@
  */
 public interface CoachService extends IService<Coach> {
 
+    List<CoachSerchVO> listAll(CoachQuery query);
+
+    Object changeState(CoachChangeStateVO vo);
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java b/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java
index 33699bd..e632e51 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java
@@ -3,9 +3,13 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.account.entity.CityManager;
 
+import java.util.List;
+
 /**
  * @author zhibing.pu
  * @Date 2023/8/1 17:03
  */
 public interface ICityManagerService extends IService<CityManager> {
+    List<CityManager> listAll();
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java
index 82bfea9..08bc11d 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java
@@ -6,10 +6,16 @@
 import com.dsh.account.service.ICityManagerService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author zhibing.pu
  * @Date 2023/8/1 17:04
  */
 @Service
 public class CityManagerServiceImpl extends ServiceImpl<CityManagerMapper, CityManager> implements ICityManagerService {
+    @Override
+    public List<CityManager> listAll() {
+        return this.list();
+    }
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java
index 01a29ad..f9f55ac 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java
@@ -3,8 +3,14 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.account.entity.Coach;
 import com.dsh.account.mapper.CoachMapper;
+import com.dsh.account.model.query.coachQuery.CoachQuery;
+import com.dsh.account.model.vo.CoachChangeStateVO;
+import com.dsh.account.model.vo.CoachSerchVO;
 import com.dsh.account.service.CoachService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -16,5 +22,15 @@
  */
 @Service
 public class CoachServiceImpl extends ServiceImpl<CoachMapper, Coach> implements CoachService {
+    @Autowired
+    private CoachMapper coachMapper;
+    @Override
+    public List<CoachSerchVO> listAll(CoachQuery query) {
+        return coachMapper.listAll(query);
+    }
 
+    @Override
+    public Object changeState(CoachChangeStateVO vo) {
+        return coachMapper.changeState(vo.getIds(),vo.getState());
+    }
 }
diff --git a/cloud-server-account/src/main/resources/mapper/CoachMapper.xml b/cloud-server-account/src/main/resources/mapper/CoachMapper.xml
index a428fb3..a823bc9 100644
--- a/cloud-server-account/src/main/resources/mapper/CoachMapper.xml
+++ b/cloud-server-account/src/main/resources/mapper/CoachMapper.xml
@@ -1,6 +1,41 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.dsh.account.mapper.CoachMapper">
+    <update id="changeState">
+        update t_coach set
+        state = #{state}
+        <where>
+            <if test="ids != null and ids.size()>0">
+                AND t_coach.id IN
+                <foreach collection="ids" separator="," item="id" open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </update>
 
 
+    <select id="listAll" resultType="com.dsh.account.model.vo.CoachSerchVO">
+        select t1.*,t2.name accountName,t2.phone accountPhone,t3.name coachTypeName from t_coach t1
+        left join t_city_manager t2 on t1.cityManagerId = t2.id
+        left join t_coach_type t3 on t1.coachTypeId = t3.id
+        <where>
+            <if test="query.city!=null and query.city!= ''">
+                and t1.city = #{query.city}
+            </if>
+            <if test="query.province!=null and query.province!= ''">
+                and t1.province = #{query.province}
+            </if>
+            <if test="query.name!=null and query.name!= ''">
+                AND t1.name LIKE concat('%',#{query.name},'%')
+            </if>
+             <if test="query.phone!=null and query.phone!= ''">
+                and t1.phone LIKE concat('%',#{query.phone},'%')
+            </if>
+            <if test="query.id!=null and query.id!= ''">
+                and t1.id LIKE concat('%',#{query.id},'%')
+            </if>
+            and t1.state != 3
+        </where>
+    </select>
 </mapper>
diff --git a/cloud-server-activity/mb-cloud-activity.iml b/cloud-server-activity/mb-cloud-activity.iml
index 9c5ecce..424b1f4 100644
--- a/cloud-server-activity/mb-cloud-activity.iml
+++ b/cloud-server-activity/mb-cloud-activity.iml
@@ -7,6 +7,10 @@
     <facet type="web" name="Web">
       <configuration>
         <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
       </configuration>
     </facet>
   </component>
@@ -16,6 +20,7 @@
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/target" />
     </content>
     <orderEntry type="inheritedJdk" />
@@ -133,6 +138,9 @@
     <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
     <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
     <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
@@ -147,9 +155,142 @@
     <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.11.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.22" level="project" />
-    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.22" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-jdbc-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-transaction-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-transaction-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-executor:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-mysql-client:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-core:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler-proxy:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-socks:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-http2:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.vertx:vertx-sql-client:4.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-sql92:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-engine:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-spi:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-statement:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.antlr:antlr4-runtime:4.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.7.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-mysql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-postgresql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-oracle:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-sqlserver:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-parser-opengauss:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-authority-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-authority-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-single-table-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-single-table-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-route:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-traffic-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-common:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-util:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.groovy:groovy:4.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-binder:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-dialect-exception-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-traffic-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-context:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-distsql-parser:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-distsql-statement:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-schedule-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-lite-core:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-api:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-infra-common:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-registry-center:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-simple-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-executor-kernel:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-error-handler-general:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-error-handler-spi:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-dataflow-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-script-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-http-executor:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-tracing-rdb:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-tracing-api:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere.elasticjob:elasticjob-lite-lifecycle:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-jdbc-h2:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-standalone-mode-repository-jdbc-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-repository-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-data-pipeline-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-data-pipeline-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-cluster-mode-repository-zookeeper-curator:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-framework:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-client:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper-jute:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.yetus:audience-annotations:0.5.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.54.Final" level="project" />
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.curator:curator-recipes:2.12.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-rewrite:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sql-translator-native-provider:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-merge:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite:calcite-linq4j:1.31.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite.avatica:avatica-core:1.22.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite.avatica:avatica-metrics:1.22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.5.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.client5:httpclient5:5.1.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.core5:httpcore5-h2:5.1.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents.core5:httpcore5:5.1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-system-datetime:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-datetime-spi:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-cosid:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: me.ahoo.cosid:cosid-core:1.14.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-sharding-nanoid:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aventrix.jnanoid:jnanoid:2.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-readwrite-splitting-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-readwrite-splitting-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-mysql:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-db-discovery-opengauss:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-encrypt-sm:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.70" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-shadow-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-shadow-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-federation-executor:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-federation-optimizer:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.calcite:calcite-core:1.31.0" level="project" />
+    <orderEntry type="library" name="Maven: com.esri.geometry:esri-geometry-api:2.2.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.uzaygezen:uzaygezen-core:0.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.yahoo.datasketches:sketches-core:0.9.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.yahoo.datasketches:memory:0.9.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.hydromatic:aggdesigner-algorithm:6.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.commons:commons-dbcp2:2.7.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.janino:commons-compiler:3.1.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.codehaus.janino:janino:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-parser-core:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-parser-api:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shardingsphere:shardingsphere-infra-parser:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.h2database:h2:1.4.200" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.2" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:1.2.1" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-common:1.2.1" level="project" />
@@ -157,7 +298,6 @@
     <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.2.1" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.58" level="project" />
-    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
     <orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.5.0" level="project" />
@@ -170,7 +310,6 @@
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.59" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-archaius:2.2.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-archaius:2.2.6.RELEASE" level="project" />
@@ -186,8 +325,6 @@
     <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty:0.4.9" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-core:2.3.0" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-httpclient:2.3.0" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-client:1.19.1" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-core:1.19.1" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: javax.ws.rs:jsr311-api:1.1.1" level="project" />
@@ -207,7 +344,6 @@
     <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
     <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.3.6.RELEASE" level="project" />
@@ -222,10 +358,10 @@
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.3.6.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
@@ -237,7 +373,7 @@
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.6.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
diff --git a/cloud-server-activity/pom.xml b/cloud-server-activity/pom.xml
index ad3b7fc..0f8081e 100644
--- a/cloud-server-activity/pom.xml
+++ b/cloud-server-activity/pom.xml
@@ -95,10 +95,7 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
+            
         </plugins>
     </build>
     <repositories>
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java
index 82ed7d6..1ad5527 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java
@@ -2,11 +2,11 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.activity.entity.BenefitsVideoClassification;
 import com.dsh.activity.entity.BenefitsVideos;
-import com.dsh.activity.model.BenefitsVideoClassificationListVo;
-import com.dsh.activity.model.BenefitsVideosInfoVo;
-import com.dsh.activity.model.BenefitsVideosListVo;
+import com.dsh.activity.model.*;
 import com.dsh.activity.service.BenefitsVideosService;
+import com.dsh.activity.service.IBenefitsVideoClassificationService;
 import com.dsh.activity.util.ResultUtil;
 import com.dsh.activity.util.TokenUtil;
 import io.swagger.annotations.ApiImplicitParam;
@@ -24,12 +24,95 @@
 
     @Autowired
     private BenefitsVideosService bfvService;
+    @Autowired
+    private IBenefitsVideoClassificationService benefitsVideoClassificationService;
 
     @Autowired
     private TokenUtil tokenUtil;
 
 
 
+    /**
+     * 获取所有福利视频分类
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/list")
+    public List<TQueryBenefitsVO> listAll(@RequestBody QueryBenefitsVedioVO vo){
+
+        return benefitsVideoClassificationService.listAll(vo);
+    }
+
+    /**
+     * 查看详情/编辑
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getById")
+    public BenefitsVideoClassification getById(@RequestBody Integer id){
+        return benefitsVideoClassificationService.getById(id);
+    }
+
+    /**
+     * 根据分类id查询福利视频分类下的视频
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getBenefitVideoById")
+    @ResponseBody
+    public List<BenefitsVideos> getBenefitVideoById(@RequestBody Integer id){
+        return bfvService.getBenefitVideoById(id);
+    }
+
+    /**
+     * 根据福利视频id获取福利视频信息
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getBenefitVideosById")
+    @ResponseBody
+    public BenefitsVideos getBenefitVideosById(@RequestBody Integer id){
+        return bfvService.getById(id);
+    }
+
+    /**
+     * 添加/修改福利视频分类
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/add")
+    public Object addSite(@RequestBody BenefitsVideoClassification site){
+        QueryWrapper<BenefitsVideoClassification> wrapper = new QueryWrapper<BenefitsVideoClassification>().eq("name", site.getName());
+        if (benefitsVideoClassificationService.list(wrapper).size()==0){
+            if(site.getId()!= null ){
+                benefitsVideoClassificationService.updateById(site);
+                return 200;
+            }else {
+                return benefitsVideoClassificationService.save(site);
+            }
+        }else return 500;
+    }
+
+    /**
+     * 添加/修改视频详情
+     * @return
+     */
+    @RequestMapping("/base/addBenefitsVideos")
+    public Object addBenefitsVideos(@RequestBody BenefitsVideos site){
+        // 通过分类Id和课程id 查询视频
+        List<BenefitsVideos> result = bfvService.getBybIdAndcId(site.getBenefitsVideoClassificationId(),site.getCourseId());
+        if (result.size()>0){
+            return 500;
+        }
+        if (site.getId() == null){
+            return bfvService.save(site);
+        }else {
+            return bfvService.updateById(site);
+        }
+    }
+    /**
+     * 上/下架、删除福利视频分类 type=1为上架 2为下架 3为删除
+     */
+    @RequestMapping("/base/benefitVideo/changeState")
+    public Object changeState(@RequestBody BenefitsVedioChangeStateVO vo){
+
+        return benefitsVideoClassificationService.changeState(vo);
+    }
 
     @PostMapping("base/benefitVideo/getList")
     public BenefitsVideos getVideosWithIds(@RequestBody Integer id){
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java
new file mode 100644
index 0000000..8b45b7b
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java
@@ -0,0 +1,101 @@
+package com.dsh.activity.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.activity.entity.BenefitsVideoClassification;
+import com.dsh.activity.entity.BenefitsVideos;
+import com.dsh.activity.entity.BodySideAppointment;
+import com.dsh.activity.feignclient.other.StoreClient;
+import com.dsh.activity.feignclient.other.model.Store;
+import com.dsh.activity.model.*;
+import com.dsh.activity.service.BenefitsVideosService;
+import com.dsh.activity.service.BodySideAppointmentService;
+import com.dsh.activity.service.IBenefitsVideoClassificationService;
+import com.dsh.activity.util.ResultUtil;
+import com.dsh.activity.util.TokenUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * 体测预约管理控制器
+ */
+@RestController
+@RequestMapping("")
+public class BodySideAppointmentsController {
+    @Autowired
+    private BodySideAppointmentService bodySideAppointmentService;
+    @Autowired
+    private StoreClient storeClient;
+
+    /**
+     * 获取所有体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/listAll")
+    public List<QueryBodySideAppointmentVO> listAll(@RequestBody QueryBodySideAppointment vo){
+        List<QueryBodySideAppointmentVO> queryBodySideAppointmentVOS = bodySideAppointmentService.listAll(vo);
+        List<Integer> list = new ArrayList<>();
+        for (QueryBodySideAppointmentVO queryBodySideAppointmentVO : queryBodySideAppointmentVOS) {
+            list.add(queryBodySideAppointmentVO.getStoreId());
+        }
+        list.add(1);
+        list.add(2);
+        List<Store> stores = storeClient.queryStoreByIds(list);
+        for (QueryBodySideAppointmentVO queryBodySideAppointmentVO : queryBodySideAppointmentVOS) {
+            for (Store store : stores) {
+                if (queryBodySideAppointmentVO.getStoreId() == store.getId()){
+                    queryBodySideAppointmentVO.setStoreName(store.getName());
+                    break;
+                }
+            }
+        }
+        return queryBodySideAppointmentVOS;
+    }
+    /**
+     * 增加/修改体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/addBodySideAppointments")
+    public Object addBodySideAppointments(@RequestBody QueryBodySideAppointmentVO vo){
+        BodySideAppointment bodySideAppointment = new BodySideAppointment();
+        BeanUtils.copyProperties(vo,bodySideAppointment);
+        bodySideAppointment.setStatus(1);
+        bodySideAppointment.setState(1);
+        bodySideAppointment.setInsertTime(new Date());
+        if (vo.getId() != null){
+           return bodySideAppointmentService.updateById(bodySideAppointment);
+        }else {
+            return bodySideAppointmentService.save(bodySideAppointment);
+        }
+    }
+
+    /**
+     * 手动标记用户已经到店并完成体测
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/changeState")
+    public Object changeState(@RequestBody List<Integer> ids){
+        return bodySideAppointmentService.changeState(ids);
+    }
+
+    /**
+     * 通过id获取体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/getInfoById")
+    public BodySideAppointment getInfoById(@RequestBody Integer id){
+        return bodySideAppointmentService.getById(id);
+
+    }
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java
index f1fe293..9c7ae71 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -39,5 +40,11 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date insertTime;
+    /**
+     * 状态 1=正常 2=下架 3=删除
+     */
+    @TableField("state")
+    private Integer state;
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java
index 5246b77..92ef6c3 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -57,8 +58,8 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date insertTime;
-
 
     @Override
     protected Serializable pkVal() {
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java
new file mode 100644
index 0000000..506a14c
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java
@@ -0,0 +1,49 @@
+package com.dsh.activity.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+@Data
+@TableName("t_body_side_appointments")
+public class BodySideAppointment {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    @TableField("province")
+    private String province;
+    @TableField("provinceCode")
+    private String provinceCode;
+    @TableField("city")
+    private String city;
+    @TableField("cityCode")
+    private String cityCode;
+    @TableField("storeId")
+    private Integer storeId;
+    @TableField("parentName")
+    private String parentName;
+    @TableField("phone")
+    private String phone;
+    @TableField("learnerName")
+    private String learnerName;
+    @TableField("learnerAge")
+    private Integer learnerAge;
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField("birthday")
+    private Date birthday;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField("appointmentTime")
+    private Date appointmentTime;
+    @TableField("status")
+    private Integer status;
+    @TableField("state")
+    private Integer state;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField("insertTime")
+    private Date insertTime;
+
+}
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java
index 21005db..79850da 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java
@@ -4,6 +4,7 @@
 import com.dsh.activity.feignclient.other.model.StoreDetailOfCourse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -17,5 +18,5 @@
 
 
     @PostMapping("/store/queryStoreByIds")
-    List<Store> queryStoreByIds(List<Integer> ids);
+    List<Store> queryStoreByIds(@RequestBody List<Integer> ids);
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java
index a7c8261..6fe48df 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java
@@ -2,10 +2,18 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dsh.activity.entity.BenefitsVideoClassification;
+import com.dsh.activity.model.QueryBenefitsVedioVO;
+import com.dsh.activity.model.TQueryBenefitsVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @date 2023/7/11 17:30
  */
 public interface BenefitsVideoClassificationMapper extends BaseMapper<BenefitsVideoClassification> {
+    List<TQueryBenefitsVO> listAll(@Param("query") QueryBenefitsVedioVO vo);
+
+    Object changeState(@Param("ids") List<Integer> ids,@Param("type") Integer state);
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java
index aec0f08..a5a0b7d 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dsh.activity.entity.BenefitsVideos;
+import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -29,4 +30,8 @@
      */
     List<Map<String, Object>> queryBenefitsVideosList(@Param("uid") Integer uid, @Param("classificationId") Integer classificationId,
                                                       @Param("ids") List<Integer> ids, @Param("pageSize") Integer pageSize, @Param("pageNo") Integer pageNo);
+
+    List<BenefitsVideos> getBenefitVideoById(@Param("id")Integer id);
+
+    List<BenefitsVideos> getBybIdAndcId(@Param("bId") Integer benefitsVideoClassificationId,@Param("cId") Integer courseId);
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java
new file mode 100644
index 0000000..5c40934
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java
@@ -0,0 +1,17 @@
+package com.dsh.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import com.dsh.activity.entity.BodySideAppointment;
+import com.dsh.activity.model.QueryBodySideAppointment;
+import com.dsh.activity.model.QueryBodySideAppointmentVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BodySideAppointmentMapper extends BaseMapper<BodySideAppointment> {
+
+    List<QueryBodySideAppointmentVO> listAll(@Param("query") QueryBodySideAppointment vo);
+
+    int changeState(@Param("ids") List<Integer> ids);
+}
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java
new file mode 100644
index 0000000..a3dc7b3
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java
@@ -0,0 +1,12 @@
+package com.dsh.activity.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BenefitsVedioChangeStateVO {
+
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java
new file mode 100644
index 0000000..c1240e8
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java
@@ -0,0 +1,11 @@
+package com.dsh.activity.model;
+
+import lombok.Data;
+/**
+ * 接收查询参数VO
+ */
+@Data
+public class QueryBenefitsVedioVO {
+    private Integer position;
+    private String name;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java
new file mode 100644
index 0000000..0e4dd46
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.model;
+
+import lombok.Data;
+
+/**
+ * 接收查询参数VO
+ */
+@Data
+public class QueryBodySideAppointment {
+    private String phone;
+    private String parentName;
+    // 1 = 待体测 2 = 已体测
+    private Integer state;
+    // 1=今日内预约 2=明日预约 7=七日内
+    private Integer day;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java
new file mode 100644
index 0000000..3bd4b51
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java
@@ -0,0 +1,33 @@
+package com.dsh.activity.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 体测预约管理查询VO
+ */
+@Data
+public class QueryBodySideAppointmentVO {
+    private Integer id;
+    private String province;
+    private String provinceCode;
+    private String city;
+    private String cityCode;
+    private Integer storeId;
+    private String storeName;
+    private String parentName;
+    private String phone;
+    private String learnerName;
+    private Integer learnerAge;
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date birthday;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
+    private Date appointmentTime;
+    private Integer status;
+    private Integer state;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+    private String provinceAndCity;
+}
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java
new file mode 100644
index 0000000..5cce8fb
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java
@@ -0,0 +1,18 @@
+package com.dsh.activity.model;
+
+import lombok.Data;
+
+/**
+ * 福利视频分类列表查询返回VO
+ */
+@Data
+public class TQueryBenefitsVO {
+    private Integer id;
+    private String name;
+    // 位置(1=线上课得积分,2=看视频得奖励)
+    private Integer position;
+    private Integer sort;
+    private Integer count;
+    private Integer state;
+    private Integer courseId;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java
index 6423f50..49cf43f 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java
@@ -2,9 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.activity.entity.BenefitsVideos;
-import com.dsh.activity.model.BenefitsVideoClassificationListVo;
-import com.dsh.activity.model.BenefitsVideosInfoVo;
-import com.dsh.activity.model.BenefitsVideosListVo;
+import com.dsh.activity.model.*;
 
 import java.util.List;
 
@@ -57,4 +55,9 @@
      * @throws Exception
      */
     void receiveAward(Integer uid, Integer id) throws Exception;
+
+
+    List<BenefitsVideos> getBenefitVideoById(Integer id);
+
+    List<BenefitsVideos> getBybIdAndcId(Integer benefitsVideoClassificationId, Integer courseId);
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java
new file mode 100644
index 0000000..3490998
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.activity.entity.BodySideAppointment;
+import com.dsh.activity.model.QueryBodySideAppointment;
+import com.dsh.activity.model.QueryBodySideAppointmentVO;
+
+import java.util.List;
+
+public interface BodySideAppointmentService extends IService<BodySideAppointment> {
+
+    List<QueryBodySideAppointmentVO> listAll(QueryBodySideAppointment vo);
+
+    Object changeState(List<Integer> ids);
+}
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java
index a6b909d..ed67eef 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java
@@ -2,10 +2,18 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.activity.entity.BenefitsVideoClassification;
+import com.dsh.activity.model.BenefitsVedioChangeStateVO;
+import com.dsh.activity.model.QueryBenefitsVedioVO;
+import com.dsh.activity.model.TQueryBenefitsVO;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @date 2023/7/11 17:31
  */
 public interface IBenefitsVideoClassificationService extends IService<BenefitsVideoClassification> {
+    List<TQueryBenefitsVO> listAll(QueryBenefitsVedioVO vo);
+
+    Object changeState(BenefitsVedioChangeStateVO vo);
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java
index 9369d4e..f3bb6b9 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java
@@ -3,8 +3,14 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.activity.entity.BenefitsVideoClassification;
 import com.dsh.activity.mapper.BenefitsVideoClassificationMapper;
+import com.dsh.activity.model.BenefitsVedioChangeStateVO;
+import com.dsh.activity.model.QueryBenefitsVedioVO;
+import com.dsh.activity.model.TQueryBenefitsVO;
 import com.dsh.activity.service.IBenefitsVideoClassificationService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
@@ -12,4 +18,17 @@
  */
 @Service
 public class BenefitsVideoClassificationServiceImpl extends ServiceImpl<BenefitsVideoClassificationMapper, BenefitsVideoClassification> implements IBenefitsVideoClassificationService {
+    @Autowired
+    private BenefitsVideoClassificationMapper benefitsVideoClassificationMapper;
+    @Override
+    public List<TQueryBenefitsVO> listAll(QueryBenefitsVedioVO vo) {
+        return benefitsVideoClassificationMapper.listAll(vo);
+    }
+
+    @Override
+    public Object changeState(BenefitsVedioChangeStateVO vo) {
+        List<Integer> ids = vo.getIds();
+        Integer state = vo.getState();
+        return benefitsVideoClassificationMapper.changeState(ids,state);
+    }
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java
index 81975a1..54e5111 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java
@@ -10,14 +10,14 @@
 import com.dsh.activity.feignclient.account.model.SaveUserIntegralChangesVo;
 import com.dsh.activity.feignclient.course.CourseClient;
 import com.dsh.activity.feignclient.course.model.Course;
+import com.dsh.activity.mapper.BenefitsVideoClassificationMapper;
 import com.dsh.activity.mapper.BenefitsVideosMapper;
-import com.dsh.activity.model.BenefitsVideoClassificationListVo;
-import com.dsh.activity.model.BenefitsVideosInfoVo;
-import com.dsh.activity.model.BenefitsVideosListVo;
+import com.dsh.activity.model.*;
 import com.dsh.activity.service.BenefitsVideosService;
 import com.dsh.activity.service.IBenefitsVideoClassificationService;
 import com.dsh.activity.service.IUserBenefitsVideosService;
 import com.dsh.activity.util.ToolUtil;
+import org.aspectj.weaver.ast.Var;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -51,6 +51,10 @@
 
     @Resource
     private UserIntegralChangesClient userIntegralChangesClient;
+    @Autowired
+    private BenefitsVideoClassificationMapper benefitsVideoClassificationMapper;
+    @Autowired
+    private BenefitsVideosMapper benefitsVideosMapper;
 
 
 
@@ -183,4 +187,16 @@
             userIntegralChangesClient.saveUserIntegralChanges(vo);
         }
     }
+
+    @Override
+    public List<BenefitsVideos> getBenefitVideoById(Integer id) {
+        return benefitsVideosMapper.getBenefitVideoById(id);
+    }
+
+    @Override
+    public List<BenefitsVideos> getBybIdAndcId(Integer benefitsVideoClassificationId, Integer courseId) {
+        return  benefitsVideosMapper.getBybIdAndcId(benefitsVideoClassificationId,courseId);
+    }
+
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java
new file mode 100644
index 0000000..383c659
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java
@@ -0,0 +1,33 @@
+package com.dsh.activity.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.activity.entity.BenefitsVideos;
+import com.dsh.activity.entity.BodySideAppointment;
+import com.dsh.activity.mapper.BenefitsVideosMapper;
+import com.dsh.activity.mapper.BodySideAppointmentMapper;
+import com.dsh.activity.model.QueryBodySideAppointment;
+import com.dsh.activity.model.QueryBodySideAppointmentVO;
+import com.dsh.activity.service.BenefitsVideosService;
+import com.dsh.activity.service.BodySideAppointmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BodySideAppointmentServiceImpl extends ServiceImpl<BodySideAppointmentMapper, BodySideAppointment> implements BodySideAppointmentService {
+    @Autowired
+    private BodySideAppointmentMapper bodySideAppointmentMapper;
+    @Override
+    public List<QueryBodySideAppointmentVO> listAll(QueryBodySideAppointment vo) {
+       return bodySideAppointmentMapper.listAll(vo);
+    }
+
+    @Override
+    public Object changeState(List<Integer> ids) {
+
+      return bodySideAppointmentMapper.changeState(ids);
+    }
+}
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml b/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml
index df28755..23af1fb 100644
--- a/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml
+++ b/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml
@@ -2,5 +2,32 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.dsh.activity.mapper.BenefitsVideoClassificationMapper">
 
+    <update id="changeState">
+        update t_benefits_video_classification set
+        state = #{type}
+        <where>
+            <if test="ids != null and ids.size()>0">
+                AND t_benefits_video_classification.id IN
+                <foreach collection="ids" separator="," item="id" open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </update>
 
+    <select id="listAll" resultType="com.dsh.activity.model.TQueryBenefitsVO">
+        select t1.*,COUNT(t2.id) AS `count`,t2.courseId courseId from t_benefits_video_classification t1
+        left join t_benefits_videos t2 on t1.id = t2.benefitsVideoClassificationId
+        <where>
+            <if test="query.position!=null and query.position!= ''">
+                and t1.position = #{query.position}
+            </if>
+            <if test="query.name!=null and query.name!= ''">
+                and t1.name like concat('%',#{query.name},'%')
+            </if>
+            AND (t2.id IS NULL OR t2.state != 3 OR t2.state != 2)
+        </where>
+        GROUP BY t1.id
+        order by t1.sort DESC
+    </select>
 </mapper>
diff --git a/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml b/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml
index 4a31b23..e0af730 100644
--- a/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml
+++ b/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml
@@ -42,5 +42,13 @@
             order by insertTime desc)
         ) as a limit #{pageSize}, #{pageNo}
     </select>
+    <select id="getBenefitVideoById" resultType="com.dsh.activity.entity.BenefitsVideos">
+        select * from t_benefits_videos where
+        t_benefits_videos.benefitsVideoClassificationId = #{id}
+    </select>
+    <select id="getBybIdAndcId" resultType="com.dsh.activity.entity.BenefitsVideos">
+        select * from t_benefits_videos
+        where benefitsVideoClassificationId=#{bId} and courseId= #{cId}
+    </select>
 
 </mapper>
diff --git a/cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml b/cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml
new file mode 100644
index 0000000..0fbf1fc
--- /dev/null
+++ b/cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dsh.activity.mapper.BodySideAppointmentMapper">
+    <update id="changeState">
+        update t_body_side_appointments set
+        status = 2
+        <where>
+            <if test="ids != null and ids.size()>0">
+                AND t_body_side_appointments.id IN
+                <foreach collection="ids" separator="," item="id" open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </update>
+
+    <select id="listAll" resultType="com.dsh.activity.model.QueryBodySideAppointmentVO">
+            select t1.* from t_body_side_appointments t1
+            <where>
+                <if test="query.phone!=null and query.phone!= ''">
+                    and t1.phone like concat('%',#{query.phone},'%')
+                </if>
+                <if test="query.parentName!=null and query.parentName!= ''">
+                    t1.parentName like concat('%',#{query.parentName},'%')
+                </if>
+                <if test="query.state!=null and query.state!= ''">
+                    and t1.state = #{query.state}
+                </if>
+            </where>
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/cloud-server-auth/mb-cloud-auth.iml b/cloud-server-auth/mb-cloud-auth.iml
index 2b5f9ff..8b42c29 100644
--- a/cloud-server-auth/mb-cloud-auth.iml
+++ b/cloud-server-auth/mb-cloud-auth.iml
@@ -120,12 +120,12 @@
     <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-security:2.2.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.3.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-oauth2:2.2.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.2.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:2.3.0.1" level="project" />
     <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.3.0.1" level="project" />
-    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
-    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security:spring-security-jwt:1.0.10.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.security.oauth:spring-security-oauth2:2.3.6.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.11.RELEASE" level="project" />
diff --git a/cloud-server-competition/pom.xml b/cloud-server-competition/pom.xml
index 59f93d3..1bdab18 100644
--- a/cloud-server-competition/pom.xml
+++ b/cloud-server-competition/pom.xml
@@ -110,10 +110,6 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
     <repositories>
diff --git a/cloud-server-course/mb-cloud-course.iml b/cloud-server-course/mb-cloud-course.iml
index ae755d5..e5db585 100644
--- a/cloud-server-course/mb-cloud-course.iml
+++ b/cloud-server-course/mb-cloud-course.iml
@@ -9,16 +9,6 @@
         <webroots />
       </configuration>
     </facet>
-    <facet type="jpa" name="JPA">
-      <configuration>
-        <setting name="validation-enabled" value="true" />
-        <setting name="provider-name" value="Hibernate" />
-        <datasource-mapping>
-          <factory-entry name="entityManagerFactory" />
-        </datasource-mapping>
-        <naming-strategy-map />
-      </configuration>
-    </facet>
   </component>
   <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
     <output url="file://$MODULE_DIR$/target/classes" />
diff --git a/cloud-server-course/pom.xml b/cloud-server-course/pom.xml
index ec8e44b..1626e9e 100644
--- a/cloud-server-course/pom.xml
+++ b/cloud-server-course/pom.xml
@@ -129,10 +129,7 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
+
         </plugins>
     </build>
     <repositories>
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
index e171113..bb2a1fe 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
@@ -9,6 +9,9 @@
 import com.dsh.course.entity.TCoursePackageType;
 import com.dsh.course.feignclient.model.ExerciseVideo;
 import com.dsh.course.model.*;
+import com.dsh.course.model.dto.CourseChangeStateDTO;
+import com.dsh.course.model.dto.TQueryBenefitsVideosDTO;
+import com.dsh.course.model.vo.TQueryBenefitsVideosVO;
 import com.dsh.course.service.TCoursePackagePaymentService;
 import com.dsh.course.service.TCoursePackageService;
 import com.dsh.course.service.TCoursePackageTypeService;
@@ -60,10 +63,27 @@
     @Autowired
     private TCoursePackagePaymentService coursePackagePaymentService;
 
+    /**
+     * 上/下架 1为上架 2为下架 3为删除
+     *
+     * @return
+     */
+    @RequestMapping("/base/course/changeState")
+    @ResponseBody
+    public Object changeState(@RequestBody CourseChangeStateDTO dto){
 
+        return courseService.changeState(dto);
+    }
 
+    /**
+     * 通过课程ids获取课程
+     * @return
+     */
+    @RequestMapping("/base/course/getCourseByCourseIds")
+    public List<TQueryBenefitsVideosVO> getCourseByCourseIds(@RequestBody TQueryBenefitsVideosDTO query){
 
-
+        return courseService.getCourseByCourseIds(query);
+    }
 
     @PostMapping("/base/course/queryList")
     public List<ExerciseVideo> queryStuCourseAfterVideos(@RequestBody List<Integer> courseIds){
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java
index 2acb8e9..7211705 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java
@@ -1,13 +1,16 @@
 package com.dsh.course.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.entity.TCoursePackageType;
+import com.dsh.course.model.vo.CoursePackageTypeVO;
+import com.dsh.course.service.TCoursePackageService;
 import com.dsh.course.service.TCoursePackageTypeService;
+import net.bytebuddy.asm.Advice;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -20,7 +23,72 @@
 
     @Autowired
     private TCoursePackageTypeService coursePackageTypeService;
+    @Autowired
+    private TCoursePackageService tCoursePackageService;
 
+
+    /**
+     * 新增课包类型
+     */
+    @ResponseBody
+    @RequestMapping("/coursePackageType/add")
+    public Object add(@RequestBody String name){
+
+        List<TCoursePackageType> list = coursePackageTypeService.list(new QueryWrapper<TCoursePackageType>().eq("name", name).ne("state",3));
+        if (list.size()!= 0){
+            return 500;
+        }else{
+            TCoursePackageType coachType = new TCoursePackageType();
+            coachType.setName(name);
+            coachType.setState(1);
+            coachType.setInsertTime(new Date());
+            coursePackageTypeService.save(coachType);
+            return 200;
+        }
+    }
+
+    /**
+     * 修改课包类型
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/coursePackageType/update")
+    public Object update(@RequestBody CoursePackageTypeVO vo){
+        List<TCoursePackageType> list = coursePackageTypeService.list(new QueryWrapper<TCoursePackageType>().eq("name", vo.getName()));
+        if (list.size()!= 0){
+            return 500;
+        }else{
+            TCoursePackageType tCoursePackageType = new TCoursePackageType();
+            tCoursePackageType.setId(vo.getId());
+            tCoursePackageType.setName(vo.getName());
+            coursePackageTypeService.updateById(tCoursePackageType);
+            return 200;
+        }
+    }
+    /**
+     * 删除课包类型
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/coursePackageType/delete")
+    public Object delete(@RequestBody CoursePackageTypeVO vo){
+        Integer id = vo.getId();
+        QueryWrapper<TCoursePackage> coursePackageTypeId = new QueryWrapper<TCoursePackage>().eq("coursePackageTypeId", id);
+        List<TCoursePackage> list = tCoursePackageService.list(coursePackageTypeId);
+        // 500表明当前课包类型正在被使用不能删除
+        if (list.size()>0){
+            return 500;
+        }else{
+            TCoursePackageType tCoursePackageType = new TCoursePackageType();
+            tCoursePackageType.setId(vo.getId());
+            tCoursePackageType.setName(vo.getName());
+            tCoursePackageType.setState(3);
+            coursePackageTypeService.updateById(tCoursePackageType);
+            return 200;
+        }
+    }
 
     /**
      * 获取课包所有类型
@@ -29,6 +97,7 @@
     @ResponseBody
     @PostMapping("/coursePackageType/queryAllCoursePackageType")
     public List<TCoursePackageType> queryAllCoursePackageType(){
-        return coursePackageTypeService.list();
+        QueryWrapper<TCoursePackageType> state = new QueryWrapper<TCoursePackageType>().ne("state", 3);
+        return coursePackageTypeService.list(state);
     }
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java
index 0e9af58..6105a95 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java
@@ -4,6 +4,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.TCourse;
 import com.dsh.course.model.QueryCourseList;
+import com.dsh.course.model.dto.CourseChangeStateDTO;
+import com.dsh.course.model.dto.TQueryBenefitsVideosDTO;
+import com.dsh.course.model.vo.TQueryBenefitsVideosVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -29,4 +32,7 @@
      */
     List<Map<String, Object>> queryCourseList(Page<Map<String, Object>> page, @Param("item") QueryCourseList queryCourseList);
 
+    List<TQueryBenefitsVideosVO> getCourseByCourseIds(@Param("query") TQueryBenefitsVideosDTO query);
+
+    int changeState(@Param("ids") List<Integer> ids ,@Param("state") Integer state);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java b/cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java
new file mode 100644
index 0000000..b3451b9
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java
@@ -0,0 +1,11 @@
+package com.dsh.course.model.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CourseChangeStateDTO {
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java b/cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java
new file mode 100644
index 0000000..8710e83
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java
@@ -0,0 +1,20 @@
+package com.dsh.course.model.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 接收视频详情列表查询参数DTO
+ */
+@Data
+public class TQueryBenefitsVideosDTO {
+    // 课程id
+    private List<Integer> coursIds;
+    // 视频名称
+    private String name;
+    // 视频类型
+    private Integer type;
+    // 1上架 2下架 3已失效
+    private Integer state;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java
new file mode 100644
index 0000000..b1a8ada
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java
@@ -0,0 +1,12 @@
+package com.dsh.course.model.vo;
+
+import lombok.Data;
+
+import javax.swing.plaf.nimbus.State;
+
+@Data
+public class CoursePackageTypeVO {
+    private Integer id;
+    private String name;
+    private Integer state;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java
new file mode 100644
index 0000000..b8e0d01
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java
@@ -0,0 +1,26 @@
+package com.dsh.course.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频详情列表查询返回VO
+ */
+@Data
+public class TQueryBenefitsVideosVO {
+    private Integer id;
+    private String name;
+    private String introduce;
+    private String coverDrawing;
+    private String introductionDrawing;
+    private String courseVideo;
+    private Integer state;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+    private Integer integral;
+    private Integer type;
+    // 福利视频ID
+    private Integer benefitsVideosId;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java
index 9f44571..e8255df 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java
@@ -4,6 +4,9 @@
 import com.dsh.course.entity.TCourse;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.model.QueryCourseList;
+import com.dsh.course.model.dto.CourseChangeStateDTO;
+import com.dsh.course.model.dto.TQueryBenefitsVideosDTO;
+import com.dsh.course.model.vo.TQueryBenefitsVideosVO;
 
 import java.util.List;
 import java.util.Map;
@@ -26,4 +29,8 @@
      * @return
      */
     List<Map<String, Object>> queryCourseList(Page<Map<String, Object>> page, QueryCourseList queryCourseList);
+
+    List<TQueryBenefitsVideosVO> getCourseByCourseIds(TQueryBenefitsVideosDTO query);
+
+    Object changeState(CourseChangeStateDTO dto);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java
index 45268f5..ec3ecd4 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java
@@ -4,10 +4,15 @@
 import com.dsh.course.entity.TCourse;
 import com.dsh.course.mapper.TCourseMapper;
 import com.dsh.course.model.QueryCourseList;
+import com.dsh.course.model.dto.CourseChangeStateDTO;
+import com.dsh.course.model.dto.TQueryBenefitsVideosDTO;
+import com.dsh.course.model.vo.TQueryBenefitsVideosVO;
 import com.dsh.course.service.TCourseService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -22,7 +27,8 @@
  */
 @Service
 public class TCourseServiceImpl extends ServiceImpl<TCourseMapper, TCourse> implements TCourseService {
-
+    @Autowired
+    private TCourseMapper courseMapper;
 
     /**
      * 获取课程管理列表
@@ -34,4 +40,16 @@
     public List<Map<String, Object>> queryCourseList(Page<Map<String, Object>> page, QueryCourseList queryCourseList) {
         return this.baseMapper.queryCourseList(page, queryCourseList);
     }
+
+    @Override
+    public List<TQueryBenefitsVideosVO> getCourseByCourseIds(TQueryBenefitsVideosDTO query) {
+
+        return courseMapper.getCourseByCourseIds(query);
+    }
+
+    @Override
+    public Object changeState(CourseChangeStateDTO dto) {
+        List<Integer> ids = dto.getIds();
+        return courseMapper.changeState(ids,dto.getState());
+    }
 }
diff --git a/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml b/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml
index 10ad714..1c9dc49 100644
--- a/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml
@@ -14,7 +14,18 @@
         <result column="state" property="state" />
         <result column="insertTime" property="insertTime" />
     </resultMap>
-
+    <update id="changeState">
+            update t_course set
+            state = #{state}
+            <where>
+                <if test="ids != null and ids.size()>0">
+                    AND t_course.id IN
+                    <foreach collection="ids" separator="," item="id" open="(" close=")">
+                        #{id}
+                    </foreach>
+                </if>
+            </where>
+    </update>
 
 
     <select id="queryCourseList" resultType="map">
@@ -27,4 +38,25 @@
         </if>
         order by insertTime desc
     </select>
+
+    <select id="getCourseByCourseIds" resultType="com.dsh.course.model.vo.TQueryBenefitsVideosVO">
+            select * from t_course
+            <where>
+                <if test="query.name != null and query.name != ''">
+                    AND t_course.name LIKE concat('%',#{query.name},'%')
+                </if>
+                <if test="query.type != null and query.type != '' ">
+                    AND t_course.type = #{query.type}
+                </if>
+                <if test="query.state != null and query.state != '' ">
+                    AND t_course.state = #{query.state}
+                </if>
+                <if test="query.coursIds != null and query.coursIds.size()>0">
+                    AND t_course.id IN
+                    <foreach collection="query.coursIds" separator="," item="coursId" open="(" close=")">
+                        #{coursId}
+                    </foreach>
+                </if>
+            </where>
+    </select>
 </mapper>
diff --git a/cloud-server-gateway/pom.xml b/cloud-server-gateway/pom.xml
index a44669b..a7e6fe4 100644
--- a/cloud-server-gateway/pom.xml
+++ b/cloud-server-gateway/pom.xml
@@ -52,10 +52,7 @@
 					</execution>
 				</executions>
 			</plugin>
-			<plugin>
-				<groupId>com.spotify</groupId>
-				<artifactId>docker-maven-plugin</artifactId>
-			</plugin>
+
 		</plugins>
 	</build>
 
diff --git a/cloud-server-management/pom.xml b/cloud-server-management/pom.xml
index 3ee8da5..85e929b 100644
--- a/cloud-server-management/pom.xml
+++ b/cloud-server-management/pom.xml
@@ -226,10 +226,6 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
         </plugins>
 
         <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java
index 1cb8d71..5c2c9af 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java
@@ -1,8 +1,15 @@
 package com.dsh.course.feignClient.account;
 
 import com.dsh.course.feignClient.account.model.CityManager;
+import com.dsh.guns.modular.system.model.Store;
+import com.dsh.guns.modular.system.model.TStore;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
@@ -19,4 +26,23 @@
      */
     @PostMapping("/cityManager/queryCityManagerById")
     CityManager queryCityManagerById(Integer id);
+
+    /**
+     * 获取已有城市管理的省、市
+     */
+    @RequestMapping("/cityManager/listAll")
+    List<CityManager> listAll();
+
+    /**
+     * 选择省 展示市
+     */
+    @RequestMapping("/cityManager/getCity")
+    List<CityManager> getCity(@RequestBody String province);
+
+    /**
+     * 选择市区 展示全部账号
+     */
+    @RequestMapping("/cityManager/getAccount")
+    List<CityManager> getAccount(@RequestBody String city);
+
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
index 84688f3..002c526 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
@@ -1,8 +1,14 @@
 package com.dsh.course.feignClient.account;
 
 import com.dsh.course.feignClient.account.model.Coach;
+import com.dsh.course.feignClient.account.model.CoachSerchVO;
+import com.dsh.guns.modular.system.model.CoachChangeStateVO;
+import com.dsh.guns.modular.system.model.CoachQuery;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
@@ -15,6 +21,36 @@
 
 
     /**
+     * 上/下架、删除常见问题 type=1为上架 2为下架 3为删除
+     */
+    @RequestMapping("/coach/changeState")
+    Object changeState(@RequestBody CoachChangeStateVO vo);
+    /**
+     * 获取教练列表数据
+     */
+    @PostMapping("/coach/listAll")
+    List<CoachSerchVO> listAll(@RequestBody CoachQuery query);
+
+
+    /**
+     * 添加教练
+     * @return
+     */
+    @RequestMapping("/base/site/addCoach")
+    Object addCoach(@RequestBody Coach coach);
+    /**
+     * 获取所有省
+     */
+    @PostMapping("/coach/getProvince")
+    List<Coach> getProvince();
+
+    /**
+     * 根据选择的省获取对应的市
+     */
+    @PostMapping("/coach/getCity")
+    List<Coach> getCity(@RequestBody String city);
+
+    /**
      * 获取城市下的所有教练
      * @param cityCode
      * @return
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java
new file mode 100644
index 0000000..ca06932
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java
@@ -0,0 +1,37 @@
+package com.dsh.course.feignClient.account;
+
+import com.dsh.course.feignClient.account.model.CoachType;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:58
+ */
+@FeignClient("mb-cloud-account")
+public interface CoachTypeClient {
+
+
+    @PostMapping("/coachType/list")
+    List<CoachType> list();
+
+    /**
+     * 新增教练类型
+     * @param
+     * @return
+     */
+    @RequestMapping("/coachType/add")
+    Object add(@RequestBody String name);
+
+    /**
+     * 修改教练类型
+     * @param
+     * @return
+     */
+    @RequestMapping("/coachType/update")
+    Object update(@RequestBody CoachType vo);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java
new file mode 100644
index 0000000..b18c003
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java
@@ -0,0 +1,25 @@
+package com.dsh.course.feignClient.account;
+
+import com.dsh.course.feignClient.account.model.CityManager;
+import com.dsh.course.feignClient.account.model.TStoreStaff;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:07
+ */
+@FeignClient("mb-cloud-account")
+public interface StoreStaffClient {
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @GetMapping("/cityManager/getStoreByStoreStaffId")
+    TStoreStaff getStoreByStoreStaffId(@RequestParam("id") Integer id);
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java
index 069f593..5cf79ef 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java
@@ -58,6 +58,7 @@
     /**
      * 生日
      */
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
     private Date birthday;
     /**
      * 性别(1=男,2=女)
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java
new file mode 100644
index 0000000..d081f33
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java
@@ -0,0 +1,107 @@
+package com.dsh.course.feignClient.account.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 教练
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-05
+ */
+@Data
+public class CoachSerchVO {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 城市管理员id
+     */
+    private Integer cityManagerId;
+    private String nameAndPhone;
+    private String accountName;
+    private String accountPhone;
+    /**
+     * 教练类型id
+     */
+    private Integer coachTypeId;
+    private String  coachTypeName;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 生日
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+    /**
+     * 性别(1=男,2=女)
+     */
+    private Integer gender;
+    /**
+     * 电话
+     */
+    private String phone;
+    /**
+     * 身份证号码
+     */
+    private String idcard;
+    /**
+     * 身高(厘米)
+     */
+    private Double height;
+    /**
+     * 体重(KG)
+     */
+    private Double weight;
+    /**
+     * 毕业院校
+     */
+    private String graduateSchool;
+    /**
+     * 毕业证照片
+     */
+    private String diploma;
+    /**
+     * 资格证书(多个逗号分隔)
+     */
+    private String certificate;
+    /**
+     * 证书照片
+     */
+    private String certificateImg;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java
new file mode 100644
index 0000000..e0accd6
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java
@@ -0,0 +1,52 @@
+package com.dsh.course.feignClient.account.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 教练类型
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_coach_type")
+public class CoachType extends Model<CoachType> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 类型名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java
new file mode 100644
index 0000000..8d49c11
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java
@@ -0,0 +1,63 @@
+package com.dsh.course.feignClient.account.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 门店员工
+ * </p>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_store_staff")
+public class TStoreStaff extends Model<TStoreStaff> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 手机号
+     */
+    @TableField("phone")
+    private Integer phone;
+    /**
+     * 密码
+     */
+    @TableField("password")
+    private Integer password;
+    /**
+     * 所属门店id
+     */
+    @TableField("storeId")
+    private Integer storeId;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java
new file mode 100644
index 0000000..081ee40
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java
@@ -0,0 +1,70 @@
+package com.dsh.course.feignClient.activity;
+
+import com.dsh.course.feignClient.activity.model.BenefitsVedioChangeStateVO;
+import com.dsh.course.feignClient.activity.model.BenefitsVideoClassification;
+import com.dsh.course.feignClient.activity.model.BenefitsVideos;
+import com.dsh.course.feignClient.activity.model.QueryBenefitsVedioVO;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 12:02
+ */
+@FeignClient("mb-cloud-activity")
+public interface BenefitsVideoClient {
+
+    /**
+     * 根据福利视频id获取福利视频信息
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getBenefitVideosById")
+    @ResponseBody
+    BenefitsVideos getBenefitVideosById(@RequestBody Integer id);
+
+    /**
+     * 获取所有福利视频分类
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/list")
+    List<TQueryBenefitsVO> listAll(@RequestBody QueryBenefitsVedioVO vo);
+
+    /**
+     * 查看详情/编辑
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getById")
+    BenefitsVideoClassification getById(@RequestBody Integer id);
+
+    /**
+     * 添加/修改福利视频分类
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/add")
+    Object addSite(@RequestBody BenefitsVideoClassification site);
+
+    /**
+     * 添加/修改视频详情
+     * @return
+     */
+    @RequestMapping("/base/addBenefitsVideos")
+    Object addBenefitsVideos(@RequestBody BenefitsVideos site);
+
+    /**
+     * 上/下架、删除福利视频分类 type=1为上架 2为下架 3为删除
+     */
+    @RequestMapping("/base/benefitVideo/changeState")
+    Object changeState(@RequestBody BenefitsVedioChangeStateVO vo);
+
+    /**
+     * 查看福利视频分类下视频
+     * @return
+     */
+    @RequestMapping("/base/benefitVideo/getBenefitVideoById")
+    public List<BenefitsVideos> getBenefitVideoById(@RequestBody Integer id);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java
new file mode 100644
index 0000000..fc236eb
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java
@@ -0,0 +1,44 @@
+package com.dsh.course.feignClient.activity;
+
+import com.dsh.course.feignClient.activity.model.*;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 体测预约
+ */
+@FeignClient("mb-cloud-activity")
+public interface BodySideAppointmentClient {
+
+    /**
+     * 获取所有体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/listAll")
+    List<QueryBodySideAppointmentVO> listAll(@RequestBody QueryBodySideAppointment vo);
+    /**
+     * 增加/修改体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/addBodySideAppointments")
+    Object addBodySideAppointments(@RequestBody QueryBodySideAppointmentVO vo);
+
+    /**
+     * 手动标记用户已经到店并完成体测
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/changeState")
+    Object changeState(@RequestBody List<Integer> ids);
+
+    /**
+     * 通过id获取体测预约记录
+     * @return
+     */
+    @RequestMapping("/base/bodySideAppointments/getInfoById")
+    BodySideAppointment getInfoById(@RequestBody Integer id);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java
new file mode 100644
index 0000000..fd34f53
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java
@@ -0,0 +1,12 @@
+package com.dsh.course.feignClient.activity.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BenefitsVedioChangeStateVO {
+
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java
new file mode 100644
index 0000000..7ff62e7
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java
@@ -0,0 +1,50 @@
+package com.dsh.course.feignClient.activity.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 17:28
+ */
+@Data
+@TableName("t_benefits_video_classification")
+public class BenefitsVideoClassification {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 分类名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 位置(1=线上课得积分,2=看视频得奖励)
+     */
+    @TableField("position")
+    private Integer position;
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+    /**
+     * 状态 1=正常 2=下架 3=删除
+     */
+    @TableField("state")
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java
new file mode 100644
index 0000000..09007fe
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java
@@ -0,0 +1,69 @@
+package com.dsh.course.feignClient.activity.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 福利视频
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_benefits_videos")
+public class BenefitsVideos extends Model<BenefitsVideos> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 分类id
+     */
+    @TableField("benefitsVideoClassificationId")
+    private Integer benefitsVideoClassificationId;
+    /**
+     * 课程id
+     */
+    @TableField("courseId")
+    private Integer courseId;
+    /**
+     * 可得积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java
new file mode 100644
index 0000000..7f7fd4e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java
@@ -0,0 +1,51 @@
+package com.dsh.course.feignClient.activity.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("t_body_side_appointments")
+public class BodySideAppointment {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    @TableField("province")
+    private String province;
+    @TableField("provinceCode")
+    private String provinceCode;
+    @TableField("city")
+    private String city;
+    @TableField("cityCode")
+    private String cityCode;
+    @TableField("storeId")
+    private Integer storeId;
+    @TableField("parentName")
+    private String parentName;
+    @TableField("phone")
+    private String phone;
+    @TableField("learnerName")
+    private String learnerName;
+    @TableField("learnerAge")
+    private Integer learnerAge;
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField("birthday")
+    private Date birthday;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField("appointmentTime")
+    private Date appointmentTime;
+    @TableField("status")
+    private Integer status;
+    @TableField("state")
+    private Integer state;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField("insertTime")
+    private Date insertTime;
+
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java
new file mode 100644
index 0000000..93b7e16
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java
@@ -0,0 +1,11 @@
+package com.dsh.course.feignClient.activity.model;
+
+import lombok.Data;
+/**
+ * 福利视频分类接收查询参数VO
+ */
+@Data
+public class QueryBenefitsVedioVO {
+    private Integer position;
+    private String name;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java
new file mode 100644
index 0000000..135cf2e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java
@@ -0,0 +1,16 @@
+package com.dsh.course.feignClient.activity.model;
+
+import lombok.Data;
+
+/**
+ * 接收查询参数VO
+ */
+@Data
+public class QueryBodySideAppointment {
+    private String phone;
+    private String parentName;
+    // 1 = 待体测 2 = 已体测
+    private Integer state;
+    // 1=今日内预约 2=明日预约 7=七日内
+    private Integer day;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java
new file mode 100644
index 0000000..24756cb
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java
@@ -0,0 +1,34 @@
+package com.dsh.course.feignClient.activity.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 体测预约管理查询VO
+ */
+@Data
+public class QueryBodySideAppointmentVO {
+    private Integer id;
+    private String  province;
+    private String  provinceCode;
+    private String  city;
+    private String  cityCode;
+    private Integer storeId;
+    private String  storeName;
+    private String  parentName;
+    private String  phone;
+    private String  learnerName;
+    private Integer learnerAge;
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date    birthday;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
+    private Date    appointmentTime;
+    private Integer status;
+    private Integer state;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date    insertTime;
+    private String  provinceAndCity;
+
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
index 73aca6a..fe050a9 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
@@ -1,12 +1,17 @@
 package com.dsh.course.feignClient.course;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.course.model.CourseChangeStateDTO;
 import com.dsh.course.feignClient.course.model.QueryCourseList;
 import com.dsh.guns.modular.system.model.EditCourseState;
 import com.dsh.guns.modular.system.model.TCourse;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVideosDTO;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVideosVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 import java.util.Map;
@@ -19,6 +24,21 @@
 public interface CourseClient {
 
     /**
+     * 上/下架 1为上架 2为下架 3为删除
+     *
+     * @return
+     */
+    @RequestMapping("/base/course/changeState")
+    Object changeState(@RequestBody CourseChangeStateDTO dto);
+
+    /**
+     * 通过课程ids获取课程
+     * @return
+     */
+    @RequestMapping("/base/course/getCourseByCourseIds")
+    List<TQueryBenefitsVideosVO> getCourseByCourseIds(@RequestBody TQueryBenefitsVideosDTO query);
+
+    /**
      * 获取课程管理列表
      * @param queryCourseList
      * @return
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java
index 3cd9e65..31b2af5 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java
@@ -1,8 +1,12 @@
 package com.dsh.course.feignClient.course;
 
+import com.dsh.course.feignClient.course.model.CoursePackageTypeVO;
 import com.dsh.course.feignClient.course.model.TCoursePackageType;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
@@ -15,6 +19,26 @@
 
 
     /**
+     * 删除课包类型
+     * @param
+     * @return
+     */
+    @RequestMapping("/coursePackageType/delete")
+     Object delete(@RequestBody CoursePackageTypeVO coachType);
+
+    /**
+     * 修改课包类型
+     * @param
+     * @return
+     */
+    @RequestMapping("/coursePackageType/update")
+     Object update(@RequestBody CoursePackageTypeVO coachType);
+    /**
+     * 新增课包类型
+     */
+    @RequestMapping("/coursePackageType/add")
+     Object add(@RequestBody String name);
+    /**
      * 获取课包所有类型
      * @return
      */
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java
new file mode 100644
index 0000000..b928b9e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java
@@ -0,0 +1,11 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CourseChangeStateDTO {
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java
new file mode 100644
index 0000000..c0d5f04
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java
@@ -0,0 +1,10 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+@Data
+public class CoursePackageTypeVO {
+    private Integer id;
+    private String name;
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java
new file mode 100644
index 0000000..db55f88
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java
@@ -0,0 +1,49 @@
+package com.dsh.course.feignClient.other;
+
+import com.dsh.course.feignClient.other.model.Site;
+import com.dsh.course.feignClient.other.model.SiteChangeStateVO;
+import com.dsh.course.feignClient.other.model.TSiteDTO;
+import com.dsh.guns.modular.system.model.ExpireSiteSearchVO;
+import com.dsh.guns.modular.system.model.SiteSearchVO;
+import com.dsh.guns.modular.system.model.TSite;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+/**
+ * 常见问题
+ */
+@FeignClient(value = "mb-cloud-other")
+public interface SiteClient {
+
+
+    /**
+     * 上/下架、删除常见问题 type=1为上架 2为下架 3为删除
+     */
+    @RequestMapping("/base/site/changeState")
+    Object changeState(@RequestBody SiteChangeStateVO vo);
+    /**
+     * 获取所有场地
+     * @return
+     */
+    @RequestMapping("/base/site/list")
+    List<TSiteDTO> listAll(@RequestBody SiteSearchVO vo);
+    /**
+     * 获取场地有效期在两个月内的场地列表
+     * @return
+     */
+    @RequestMapping("/base/site/listExipre")
+    List<TSiteDTO> listExipre(@RequestBody ExpireSiteSearchVO vo);
+
+    /**
+     * 添加场地管理
+     * @return
+     */
+    @RequestMapping("/base/site/addSite")
+    Object addSite(@RequestBody Site site);
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java
new file mode 100644
index 0000000..d571844
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java
@@ -0,0 +1,45 @@
+package com.dsh.course.feignClient.other;
+
+import com.dsh.course.feignClient.other.model.Site;
+import com.dsh.course.feignClient.other.model.SiteChangeStateVO;
+import com.dsh.course.feignClient.other.model.TSiteDTO;
+import com.dsh.course.feignClient.other.model.TSiteLockDTO;
+import com.dsh.guns.modular.system.model.SiteSearchVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 常见问题
+ */
+@FeignClient(value = "mb-cloud-other")
+public interface SiteLockClient {
+
+    /**
+     * 锁定场地列表
+     * @param
+     * @return
+     */
+    @PostMapping("/siteLock/getListById/{id}")
+    public List<TSiteLockDTO> getListById(@PathVariable("id") Integer id);
+
+    /**
+     * 添加锁定场地
+     * @param
+     * @return
+     */
+    @PostMapping("/siteLock/addSiteLock")
+    public Object addSiteLock(@RequestBody TSiteLockDTO siteLock);
+
+    /**
+     * 删除锁定场地
+     * @param
+     * @return
+     */
+    @PostMapping("/siteLock/deleteSiteLock/{id}")
+    public Object deleteSiteLock(@PathVariable("id") Integer id);
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java
new file mode 100644
index 0000000..bdaa8bf
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java
@@ -0,0 +1,50 @@
+package com.dsh.course.feignClient.other;
+
+import com.dsh.course.feignClient.other.model.FrequentlyAskedQuestions;
+import com.dsh.course.feignClient.other.model.TSiteDTO;
+import com.dsh.guns.modular.system.model.QuestionChangeStateVO;
+import com.dsh.guns.modular.system.model.SiteSearchVO;
+import com.dsh.guns.modular.system.model.Store;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 常见问题
+ */
+@FeignClient(value = "mb-cloud-other")
+public interface StoreClient {
+
+    /**
+     * 选择市区 展示全部门店
+     */
+    @RequestMapping("base/store/getStore")
+    List<Store> getStore(@RequestBody String city);
+
+    /**
+     * 根据所选门店 查询经营时间
+     * @param oneId
+     * @return
+     */
+    @RequestMapping("base/store/getTime")
+    Store getTime(@RequestBody String oneId);
+
+    /**
+     * 根据门店id获取门店信息
+     */
+    @RequestMapping("base/site/getStoreById")
+    Store getStoreById(@RequestBody Integer id);
+    /**
+     * 根据城市管理员id获取门店
+     */
+    @RequestMapping("base/site/getStoreByCityManagerId")
+    List<Store> getStoreByCityManagerId(@RequestBody Integer id);
+    /**
+     * 根据员工id获取门店
+     */
+    @RequestMapping("base/site/getStoreByStoreStaffId")
+    List<Store> getStoreByStoreStaffId(@RequestBody Integer id);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java
new file mode 100644
index 0000000..90d6814
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java
@@ -0,0 +1,112 @@
+package com.dsh.course.feignClient.other.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/13 15:57
+ */
+@Data
+@TableName("t_site")
+public class Site {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店id
+     */
+    @TableField("storeId")
+    private Integer storeId;
+    /**
+     * 场地名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 场地类型id
+     */
+    @TableField("siteTypeId")
+    private Integer siteTypeId;
+    /**
+     * 城市管理员id
+     */
+    @TableField("cityManagerId")
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    @TableField("appointmentStartTime")
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    @TableField("appointmentEndTime")
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    @TableField("cashPrice")
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    @TableField("playPaiCoin")
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    @TableField("insuranceEndTime")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    @TableField("insuranceImg")
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    @TableField("managementPlan")
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date insertTime;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java
new file mode 100644
index 0000000..1c047ad
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java
@@ -0,0 +1,91 @@
+package com.dsh.course.feignClient.other.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:43
+ */
+@Data
+public class SiteAddDTO {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 场地类型id
+     */
+    private Integer siteTypeId;
+    /**
+     * 城市管理员id
+     */
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date insertTime;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java
new file mode 100644
index 0000000..7d53f1b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java
@@ -0,0 +1,21 @@
+package com.dsh.course.feignClient.other.model;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 修改场地状态
+ */
+@Data
+public class SiteChangeStateVO {
+    /**
+     * 场地Id
+     */
+    List<Integer> siteIds;
+    /**
+     * 上/下架 删除场地 type=1 上架 2下架 3删除
+     */
+    Integer type;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java
new file mode 100644
index 0000000..87831ca
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java
@@ -0,0 +1,116 @@
+package com.dsh.course.feignClient.other.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 场地管理列表DTO
+ * @Date 2023/8/1 17:43
+ */
+@Data
+@TableName("t_site")
+public class TSiteDTO {
+
+    private Integer id;
+    /**
+     * 门店id
+     */
+
+    private Integer storeId;
+    /**
+     * 门店名称
+     */
+    private String storeName;
+    /**
+     * 场地名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 场地类型id
+     */
+    @TableField("siteTypeId")
+    private Integer siteTypeId;
+    /**
+     * 场地类型名称
+     */
+    @TableField("siteTypeId")
+    private String siteTypeName;
+    /**
+     * 城市管理员id
+     */
+    @TableField("cityManagerId")
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    @TableField("appointmentStartTime")
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    @TableField("appointmentEndTime")
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    @TableField("cashPrice")
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    @TableField("playPaiCoin")
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    @TableField("insuranceEndTime")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    @TableField("insuranceImg")
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    @TableField("managementPlan")
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java
new file mode 100644
index 0000000..3feb72e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java
@@ -0,0 +1,35 @@
+package com.dsh.course.feignClient.other.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 锁定场地DTO
+ */
+@Data
+public class TSiteLockDTO {
+    /**
+     * 场地id
+     */
+    private Integer id;
+    /**
+     * 场地id
+     */
+    private Integer siteId;
+    /**
+     * 锁定开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date startTime;
+    /**
+     * 锁定结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date endTime;
+
+    private String ssTime;
+
+    private String eeTime;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java
new file mode 100644
index 0000000..e5a6959
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java
@@ -0,0 +1,243 @@
+package com.dsh.guns.modular.system.controller.code;
+
+
+import com.dsh.course.feignClient.account.CityManagerClient;
+import com.dsh.course.feignClient.account.CoachClient;
+import com.dsh.course.feignClient.account.CoachTypeClient;
+import com.dsh.course.feignClient.account.model.CityManager;
+import com.dsh.course.feignClient.account.model.Coach;
+import com.dsh.course.feignClient.account.model.CoachSerchVO;
+import com.dsh.course.feignClient.account.model.CoachType;
+import com.dsh.course.feignClient.other.model.Site;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.modular.system.model.CoachChangeStateVO;
+import com.dsh.guns.modular.system.model.CoachQuery;
+import com.dsh.guns.modular.system.model.Store;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * 教练
+ */
+@Controller
+@RequestMapping("/tCoach")
+public class CoachController {
+
+    private String PREFIX = "/system/tCoach/";
+    @Autowired
+    private CoachTypeClient coachTypeClient;
+    @Autowired
+    private CoachClient coachClient;
+    @Autowired
+    private CityManagerClient cityManagerClient;
+
+    /**
+     * 跳转教练管理首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        List<Coach> list1=coachClient.getProvince();
+        CoachQuery coachQuery = new CoachQuery();
+        List<CoachSerchVO> data = coachClient.listAll(coachQuery);
+
+        List<String> province = new ArrayList<>();
+        for (Coach coach : list1) {
+            province.add(coach.getProvince());
+        }
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("data",data);
+        model.addAttribute("list",province);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        return PREFIX + "TCoach.html";
+    }
+    /**
+     * 获取教练列表
+     */
+    @RequestMapping(value = "/getCity")
+    @ResponseBody
+    public List<Coach> getCity(String province) {
+        return coachClient.getCity(province);
+    }
+
+    /**
+     * 跳转添加教练页面
+     */
+    @RequestMapping("/addCoach")
+    public String addCoach(Model model) {
+        List<CityManager> province = cityManagerClient.listAll();
+        Set<String> seenNames = new HashSet<>();
+        List<CityManager> result = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            if(!seenNames.contains(cityManager.getProvince())){
+                result.add(cityManager);
+                seenNames.add(cityManager.getProvince());
+            }
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        CoachQuery coachQuery = new CoachQuery();
+        List<CoachSerchVO> data = coachClient.listAll(coachQuery);
+        List<CoachType> list = coachTypeClient.list();
+
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("data",data);
+        model.addAttribute("list",result);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("coachType",list);
+        return PREFIX + "TCoach_add.html";
+    }
+    /**
+     *  添加教练
+     */
+    @ResponseBody
+    @RequestMapping(value = "/add")
+    public ResultUtil addCoach(@RequestBody Coach coach) {
+        Integer objectId = UserExt.getUser().getObjectId();
+        if (UserExt.getUser().getObjectType() == 2){
+            CityManager cityManager = cityManagerClient.queryCityManagerById(objectId);
+            coach.setProvince(cityManager.getProvince());
+            coach.setProvinceCode(cityManager.getProvinceCode());
+            coach.setCity(cityManager.getCity());
+            coach.setCityCode(cityManager.getCityCode());
+            coach.setCityManagerId(objectId);
+
+        }
+        if (coach.getDiploma().equals("")) coach.setDiploma(null);
+        if (coach.getCertificateImg().equals("") ){
+            coach.setCertificateImg(null);
+        }
+        if (coach.getCertificateImg()!=null){
+            coach.setCertificateImg(coach.getCertificateImg().substring(1));
+        }
+        coach.setInsertTime(new Date());
+        coach.setState(1);
+        coachClient.addCoach(coach);
+        return ResultUtil.success("添加成功");
+    }
+
+    /**
+     *  1为冻结 2为解冻
+     *
+     * @return
+     */
+    @RequestMapping("/changeState")
+    @ResponseBody
+    public Object changeState(@RequestBody CoachChangeStateVO vo){
+        coachClient.changeState(vo);
+        return ResultUtil.success();
+    }
+    /**
+     * 跳转修改教练页面
+     */
+    @RequestMapping("/updateCoach/{id}")
+    public String updateCoach(Model model, @PathVariable("id") Integer id) {
+        CoachQuery coachQuery = new CoachQuery();
+        coachQuery.setId(id);
+        List<CoachSerchVO> data = coachClient.listAll(coachQuery);
+        List<CityManager> province = cityManagerClient.listAll();
+        Set<String> seenNames = new HashSet<>();
+        List<CityManager> result = new ArrayList<>();
+        List<CityManager> city = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            if(!seenNames.contains(cityManager.getProvince())){
+                result.add(cityManager);
+                seenNames.add(cityManager.getProvince());
+            }
+            if(data.get(0).getProvince().equals(cityManager.getProvince())){
+                city.add(cityManager);
+            }
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        List<CityManager> accounts = cityManagerClient.getAccount(data.get(0).getCity());
+        List<CoachType> list = coachTypeClient.list();
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("data",data.get(0));
+        model.addAttribute("list",result);
+        model.addAttribute("city",city);
+        model.addAttribute("cityManagers",accounts);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("coachType",list);
+        // 1为查看详情
+        model.addAttribute("type",0);
+        String[] split = data.get(0).getCertificateImg().split(",");
+        List<String> pictures = new ArrayList<>(Arrays.asList(split));
+        model.addAttribute("pictures",pictures);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String birthday = format.format(data.get(0).getBirthday());
+        model.addAttribute("birthday",birthday);
+        return PREFIX + "TCoach_edit.html";
+    }
+    /**
+     * 跳转修改教练页面
+     */
+    @RequestMapping("/infoCoach/{id}")
+    public String infoCoach(Model model, @PathVariable("id") Integer id) {
+        CoachQuery coachQuery = new CoachQuery();
+        coachQuery.setId(id);
+        List<CoachSerchVO> data = coachClient.listAll(coachQuery);
+        List<CityManager> province = cityManagerClient.listAll();
+        Set<String> seenNames = new HashSet<>();
+        List<CityManager> result = new ArrayList<>();
+        List<CityManager> city = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            if(!seenNames.contains(cityManager.getProvince())){
+                result.add(cityManager);
+                seenNames.add(cityManager.getProvince());
+            }
+            if(data.get(0).getProvince().equals(cityManager.getProvince())){
+                city.add(cityManager);
+            }
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        List<CityManager> accounts = cityManagerClient.getAccount(data.get(0).getCity());
+        List<CoachType> list = coachTypeClient.list();
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("data",data.get(0));
+        model.addAttribute("list",result);
+        model.addAttribute("city",city);
+        model.addAttribute("cityManagers",accounts);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("coachType",list);
+        // 1为查看详情
+        model.addAttribute("type",1);
+        String[] split = data.get(0).getCertificateImg().split(",");
+        List<String> pictures = new ArrayList<>(Arrays.asList(split));
+        model.addAttribute("pictures",pictures);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String birthday = format.format(data.get(0).getBirthday());
+        model.addAttribute("birthday",birthday);
+        return PREFIX + "TCoach_edit.html";
+    }
+    /**
+     * 获取教练列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public List<CoachSerchVO> list(String province, String city, String name, String phone) {
+        CoachQuery coachQuery = new CoachQuery();
+        coachQuery.setProvince(province);
+        coachQuery.setCity(city);
+        coachQuery.setName(name);
+        coachQuery.setPhone(phone);
+        return coachClient.listAll(coachQuery);
+    }
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java
new file mode 100644
index 0000000..553ff2d
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java
@@ -0,0 +1,75 @@
+package com.dsh.guns.modular.system.controller.code;
+
+
+import com.dsh.course.feignClient.account.CoachTypeClient;
+import com.dsh.course.feignClient.account.model.CoachType;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.modular.system.model.QuestionSearchVO;
+import net.bytebuddy.asm.Advice;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * 教练类型
+ */
+@Controller
+@RequestMapping("/tCoachType")
+public class CoachTypeController {
+
+    private String PREFIX = "/system/tCoachType/";
+    @Autowired
+    private CoachTypeClient coachTypeClient;
+
+    /**
+     * 跳转常见问题首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        return PREFIX + "TCoachType.html";
+    }
+    /**
+     * 获取教练类型列表
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public List<CoachType> list() {
+        return coachTypeClient.list();
+    }
+    /**
+     * 新增教练类型
+     */
+    @RequestMapping("/add")
+    @ResponseBody
+    public Object addCoachType(String name) {
+        return coachTypeClient.add(name);
+    }
+    /**
+     * 修改教练类型
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public Object updateCoachType(@RequestBody CoachType vo) {
+
+        return coachTypeClient.update(vo);
+    }
+    /**
+     * 删除教练类型
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public Object deleteCoachType(Integer id) {
+        CoachType coachType = new CoachType();
+        coachType.setId(id);
+        coachType.setState(3);
+        return coachTypeClient.update(coachType);
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java
index 0c839e7..061a869 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java
@@ -35,7 +35,7 @@
 
 
 /**
- * 优惠券管理 控制器
+ * 常见问题管理 控制器
  */
 
 @Controller
@@ -63,6 +63,8 @@
      */
     @RequestMapping("")
     public String index(Model model) {
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
         return PREFIX + "TQuestion.html";
     }
 
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java
new file mode 100644
index 0000000..42238b3
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java
@@ -0,0 +1,115 @@
+package com.dsh.guns.modular.system.controller.code;
+
+
+import com.dsh.course.feignClient.account.CityManagerClient;
+import com.dsh.course.feignClient.account.model.CityManager;
+import com.dsh.course.feignClient.account.model.Coach;
+import com.dsh.course.feignClient.activity.BodySideAppointmentClient;
+import com.dsh.course.feignClient.activity.model.BodySideAppointment;
+import com.dsh.course.feignClient.activity.model.QueryBodySideAppointment;
+import com.dsh.course.feignClient.activity.model.QueryBodySideAppointmentVO;
+import com.dsh.course.feignClient.other.StoreClient;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.modular.system.model.CoachQuery;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 体测预约管理控制器
+ */
+@Controller
+@RequestMapping("/bodySideAppointment")
+public class TBodySideAppointmentsController {
+    private String PREFIX = "/system/bodySideAppointment/";
+
+    @Autowired
+    private StoreClient storeClient;
+    @Autowired
+    private BodySideAppointmentClient bodySideAppointmentClient;
+    @Autowired
+    private CityManagerClient cityManagerClient;
+    /**
+     * 跳转体测预约管理首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        return PREFIX + "TBodySideAppointment.html";
+    }
+    /**
+     * 跳转体测预约管理添加页面
+     */
+    @RequestMapping("/add")
+    public String add(Model model) {
+        List<CityManager> province = cityManagerClient.listAll();
+        Set<String> seenNames = new HashSet<>();
+        List<CityManager> result = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            if(!seenNames.contains(cityManager.getProvince())){
+                result.add(cityManager);
+                seenNames.add(cityManager.getProvince());
+            }
+        }
+        model.addAttribute("list",result);
+        return PREFIX + "TBodySideAppointment_add.html";
+    }
+    /**
+     * 跳转体测预约管理编辑页面
+     */
+    @RequestMapping("/update")
+    public String update(Model model) {
+        return PREFIX + "TBodySideAppointment_edit.html";
+    }
+
+    /**
+     * 获取所有体测预约记录
+     * @return
+     */
+    @RequestMapping("/listAll")
+    @ResponseBody
+    public List<QueryBodySideAppointmentVO> listAll(String phone,String parentName,Integer state){
+        QueryBodySideAppointment vo = new QueryBodySideAppointment();
+        vo.setParentName(parentName);
+        vo.setPhone(phone);
+        vo.setState(state);
+        List<QueryBodySideAppointmentVO> queryBodySideAppointmentVOS = bodySideAppointmentClient.listAll(vo);
+        for (QueryBodySideAppointmentVO queryBodySideAppointmentVO : queryBodySideAppointmentVOS) {
+            queryBodySideAppointmentVO.setProvinceAndCity(queryBodySideAppointmentVO.getProvince()+queryBodySideAppointmentVO.getCity());
+        }
+        return queryBodySideAppointmentVOS;
+    }
+
+    /**
+     *  添加/修改体测预约记录
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addBodySideAppointments")
+    public ResultUtil addBodySideAppointments(@RequestBody QueryBodySideAppointmentVO vo) {
+        bodySideAppointmentClient.addBodySideAppointments(vo);
+        return ResultUtil.success("添加成功");
+    }
+
+    /**
+     *  添加/修改体测预约记录
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getInfoById")
+    public BodySideAppointment getInfoById(@RequestBody Integer id) {
+        return bodySideAppointmentClient.getInfoById(id);
+    }
+
+    /**
+     *  手动标记用户已经到店并完成体测
+     */
+    @ResponseBody
+    @RequestMapping(value = "/changeState")
+    public Object changeState(@RequestBody List<Integer> ids) {
+        return bodySideAppointmentClient.changeState(ids);
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
index 6b2ba0f..a7ea97d 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
@@ -3,6 +3,7 @@
 import cn.hutool.crypto.SecureUtil;
 import com.alibaba.nacos.common.utils.Md5Utils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.City;
 import com.dsh.course.feignClient.account.CityClient;
@@ -171,9 +172,11 @@
     @RequestMapping(value = "/onChange")
     @ResponseBody
     public Object onChange(Integer oneId) {
+        if (oneId == null) return null;
         try {
-            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, oneId));
-            return cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getId, oneId));
+            QueryWrapper<TCity> query = new QueryWrapper<TCity>().eq("parent_id", one.getId());
+            return cityService.list(query);
         }catch (Exception e){
             e.printStackTrace();
             return ERROR;
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
index 544365d..bf6aacd 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
@@ -24,6 +24,7 @@
 import com.dsh.guns.modular.system.service.IRegionService;
 import com.dsh.guns.modular.system.service.IStoreService;
 import com.dsh.guns.modular.system.util.OBSUploadUtil;
+import com.dsh.guns.modular.system.util.ResultUtil;
 import org.apache.commons.beanutils.ConvertUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -276,6 +277,7 @@
     @RequestMapping(value = "/uploadPic")
     @ResponseBody
     public Object add(@RequestParam("file") MultipartFile imgFile) throws IOException {
+        if (imgFile != null){
         String originalFilename = imgFile.getOriginalFilename();
         String newName = originalFilename.substring(imgFile.getOriginalFilename().lastIndexOf("."));
         String url = OBSUploadUtil.inputStreamUpload(imgFile);
@@ -293,7 +295,9 @@
         //文件大小(字节数)
         map.put("size", imgFile.getSize() + "");
         System.out.println(map);
-        return url;
+            return url;
+        }
+        return ResultUtil.success();
     }
 
     /**
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java
new file mode 100644
index 0000000..dbdf8a6
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java
@@ -0,0 +1,127 @@
+package com.dsh.guns.modular.system.controller.code;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.account.CityManagerClient;
+import com.dsh.course.feignClient.account.CoachClient;
+import com.dsh.course.feignClient.account.model.CityManager;
+import com.dsh.course.feignClient.account.model.Coach;
+import com.dsh.course.feignClient.account.model.CoachType;
+import com.dsh.course.feignClient.course.CoursePackageClient;
+import com.dsh.course.feignClient.course.CoursePackageDiscountClient;
+import com.dsh.course.feignClient.course.CoursePackagePaymentConfigClient;
+import com.dsh.course.feignClient.course.CoursePackageTypeClient;
+import com.dsh.course.feignClient.course.model.*;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.core.base.controller.BaseController;
+import com.dsh.guns.core.util.ToolUtil;
+import com.dsh.guns.modular.system.model.TSite;
+import com.dsh.guns.modular.system.model.TStore;
+import com.dsh.guns.modular.system.service.ICoursePackageService;
+import com.dsh.guns.modular.system.service.IStoreService;
+import com.dsh.guns.modular.system.service.ITSiteService;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 11:50
+ */
+@Controller
+@RequestMapping("/coursePackageType")
+public class TCoursePackageTypeController extends BaseController {
+
+    private String PREFIX = "/system/coursePackageType/";
+
+    @Autowired
+    private ICoursePackageService coursePackageService;
+
+    @Resource
+    private CoursePackageTypeClient coursePackageTypeClient;
+
+    @Autowired
+    private IStoreService storeService;
+
+    @Resource
+    private CityManagerClient cityManagerClient;
+
+    @Autowired
+    private ITSiteService siteService;
+
+    @Resource
+    private CoachClient coachClient;
+
+    @Resource
+    private CoursePackagePaymentConfigClient coursePackagePaymentConfigClient;
+
+    @Resource
+    private CoursePackageDiscountClient coursePackageDiscountClient;
+
+    @Resource
+    private CoursePackageClient coursePackageClient;
+
+    /**
+     * 跳转到列表页
+     * @param model
+     * @return
+     */
+    @GetMapping("")
+    public String openCoursePackageListPage(Model model){
+        Integer objectType = UserExt.getUser().getObjectType();
+        model.addAttribute("objectType", objectType);
+        return PREFIX + "CoursePackageType.html";
+    }
+
+    /**
+     * 获取课包类型列表
+     * @return
+     */
+    @RequestMapping("/list")
+    @ResponseBody
+    public List<TCoursePackageType> openAddCoursePackage(){
+
+        return coursePackageTypeClient.queryAllCoursePackageType();
+    }
+
+    /**
+     * 跳转到添加页
+     * @return
+     */
+    @RequestMapping("/add")
+    @ResponseBody
+    public Object openAddCoursePackageType(String name){
+        return coursePackageTypeClient.add(name);
+    }
+
+    /**
+     * 跳转到编辑页
+     * @param model
+     * @param id
+     * @return
+     */
+    /**
+     * 修改教练类型
+     */
+    @RequestMapping("/update")
+    @ResponseBody
+    public Object updateCoursePackageType(@RequestBody CoursePackageTypeVO vo) {
+        return coursePackageTypeClient.update(vo);
+    }
+    /**
+     * 删除课包类型--先判断当前课包类型有没有在被使用
+     * @return
+     */
+    @RequestMapping("/delete")
+    @ResponseBody
+    public Object deleteCoursePackageType(@RequestBody CoursePackageTypeVO vo){
+
+        return coursePackageTypeClient.delete(vo);
+    }
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java
index 6072d3d..7f09add 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java
@@ -1,12 +1,24 @@
 package com.dsh.guns.modular.system.controller.code;
+import java.math.BigDecimal;
 
 import cn.hutool.crypto.SecureUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.feignClient.account.CityClient;
+import com.dsh.course.feignClient.account.CityManagerClient;
+import com.dsh.course.feignClient.account.StoreStaffClient;
 import com.dsh.course.feignClient.account.model.CityListQuery;
+import com.dsh.course.feignClient.account.model.CityManager;
 import com.dsh.course.feignClient.account.model.TCityManager;
 import com.dsh.course.feignClient.competition.CompetitionClient;
+import com.dsh.course.feignClient.other.SiteClient;
+import com.dsh.course.feignClient.other.SiteLockClient;
+import com.dsh.course.feignClient.other.StoreClient;
+import com.dsh.course.feignClient.other.model.Site;
+import com.dsh.course.feignClient.other.model.SiteChangeStateVO;
+import com.dsh.course.feignClient.other.model.TSiteDTO;
+import com.dsh.course.feignClient.other.model.TSiteLockDTO;
 import com.dsh.course.mapper.UserMapper;
 import com.dsh.guns.config.UserExt;
 import com.dsh.guns.core.base.controller.BaseController;
@@ -14,19 +26,21 @@
 import com.dsh.guns.core.common.constant.factory.PageFactory;
 import com.dsh.guns.core.util.ToolUtil;
 import com.dsh.guns.modular.system.model.*;
-import com.dsh.guns.modular.system.service.ICityService;
-import com.dsh.guns.modular.system.service.IStoreService;
-import com.dsh.guns.modular.system.service.ITSiteService;
-import com.dsh.guns.modular.system.service.StoreConfigService;
+import com.dsh.guns.modular.system.service.*;
+import com.dsh.guns.modular.system.util.ResultUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.lang.reflect.Type;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -57,207 +71,455 @@
 
     @Resource
     private StoreConfigService storeConfigService;
+    @Resource
+    private ITSiteTypeService siteTypeService;
 
     @Autowired
+    private CityManagerClient cityManagerClient;
+    @Resource
+    private SiteClient siteClient;
+    @Autowired
     private ITSiteService siteService;
+    @Resource
+    private StoreClient storeClient;
+    @Autowired
+    private IRegionService regionService;
+    @Autowired
+    private SiteLockClient siteLockClient;
 
 
     /**
-     * 跳转到车辆管理首页
+     * 跳转到场地管理首页
      */
     @RequestMapping("")
     public String index(Model model) {
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        model.addAttribute("userType",objectType);
+        List<CityManager> province = cityManagerClient.listAll();
+        // 已有城市管理的省
+        ArrayList<String> list1 = new ArrayList<>();
+        // 已有城市管理的市
+        ArrayList<String> list2 = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            list1.add(cityManager.getProvince());
+            list2.add(cityManager.getCity());
+        }
+        HashSet<String> set = new HashSet<String>(list1);
         List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
-        model.addAttribute("list",list);
+        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+        wrapper.eq("state",1);
+        List<TSiteType> siteType = siteTypeService.list(wrapper);
+        model.addAttribute("list",set);
+        model.addAttribute("siteType",siteType);
         String roleid = UserExt.getUser().getRoleid();
-        model.addAttribute("role",1);
+        model.addAttribute("role",roleid);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("type",1);
+        return PREFIX + "TSite.html";
+    }
+    /**
+     * 跳转到场地管理首页--查询场地有效期在两个月内的场地信息
+     */
+    @RequestMapping("/expireInsuranceEndTime")
+    public String expireInsuranceEndTime(Model model) {
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        model.addAttribute("userType",objectType);
+        List<CityManager> province = cityManagerClient.listAll();
+        // 已有城市管理的省
+        ArrayList<String> list1 = new ArrayList<>();
+        // 已有城市管理的市
+        ArrayList<String> list2 = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            list1.add(cityManager.getProvince());
+            list2.add(cityManager.getCity());
+        }
+        HashSet<String> set = new HashSet<String>(list1);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+        wrapper.eq("state",1);
+        List<TSiteType> siteType = siteTypeService.list(wrapper);
+        model.addAttribute("list",set);
+        model.addAttribute("siteType",siteType);
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("type",2);
         return PREFIX + "TSite.html";
     }
 
     /**
-     * 跳转到添加车辆管理
+     * 上/下架 1为上架 2为下架 3为删除
+     *
+     * @return
      */
-    @RequestMapping("/tShop_add")
-    public String tCompetitionAdd(Model model) {
-        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
-        model.addAttribute("list",list);
-        String roleid = UserExt.getUser().getRoleid();
-        model.addAttribute("role",2);
-        return PREFIX + "tShop_add.html";
+    @RequestMapping("/changeState")
+    @ResponseBody
+    public Object changeState(@RequestBody SiteChangeStateVO vo){
+        siteClient.changeState(vo);
+        return ResultUtil.success();
     }
-
+    /**
+     * 添加锁定场地
+     *
+     * @return
+     */
+    @RequestMapping("/addSiteLock")
+    @ResponseBody
+    public Object addSiteLock(@RequestBody TSiteLockDTO dto){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        try {
+            dto.setStartTime(simpleDateFormat.parse(dto.getSsTime()));
+            dto.setEndTime(simpleDateFormat.parse(dto.getEeTime()));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Object o = siteLockClient.addSiteLock(dto);
+        return ResultUtil.success(o);
+    }
 
     /**
-     * 跳转到修改车辆管理
+     * 删除锁定场地
+     *
+     * @return
      */
-    @RequestMapping("/tShop_update/{id}")
-    public String tCityUpdate(@PathVariable Integer id, Model model) {
-        TStore byId = storeService.getById(id);
-        model.addAttribute("item",byId);
-        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
-        model.addAttribute("list",list);
-        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, byId.getProvinceCode()));
-        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
-        CityListQuery cityListQuery = new CityListQuery();
-        cityListQuery.setOffset(1);
-        cityListQuery.setLimit(10000);
-        cityListQuery.setCityCode(byId.getCityCode());
-        Page<TCityManager> list2 = cityClient.list(cityListQuery);
-        model.addAttribute("list1",list1);
-        model.addAttribute("list2",list2.getRecords());
-        String roleid = UserExt.getUser().getRoleid();
-        model.addAttribute("role",2);
-        model.addAttribute("time",byId.getStartTime()+" - "+byId.getEndTime());
-        User byId1 = userMapper.selectById(byId.getStoreStaffId());
-        model.addAttribute("city",byId1);
-        model.addAttribute("type",1);
-        return PREFIX + "tShop_edit.html";
+    @RequestMapping("/deleteSiteLock/{id}")
+    @ResponseBody
+    public Object deleteSiteLock(@PathVariable("id") Integer id){
+        siteLockClient.deleteSiteLock(id);
+        return ResultUtil.success();
     }
-    @RequestMapping("/tShop_info/{id}")
-    public String tCityInfo(@PathVariable Integer id, Model model) {
-        TStore byId = storeService.getById(id);
-        model.addAttribute("item",byId);
-        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
-        model.addAttribute("list",list);
-        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, byId.getProvinceCode()));
-        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
-        CityListQuery cityListQuery = new CityListQuery();
-        cityListQuery.setOffset(1);
-        cityListQuery.setLimit(10000);
-        cityListQuery.setCityCode(byId.getCityCode());
-        Page<TCityManager> list2 = cityClient.list(cityListQuery);
-        model.addAttribute("list1",list1);
-        model.addAttribute("list2",list2.getRecords());
+
+    /**
+     * 根据场地id 获取锁定列表
+     *
+     * @return
+     */
+    @RequestMapping("/getSiteLockBySiteId/{id}")
+    @ResponseBody
+    public Object getSiteLockBySiteId(@PathVariable("id") Integer id){
+        return siteLockClient.getListById(id);
+    }
+    /**
+     * 跳转到场地管理编辑页面
+     */
+    @RequestMapping("/openEditTSite/{id}")
+    public String openEditTSite(Model model,@PathVariable("id") Integer id) {
+        List<CityManager> province = cityManagerClient.listAll();
+        // 已有城市管理的省
+        ArrayList<String> list1 = new ArrayList<>();
+        // 已有城市管理的市
+        for (CityManager cityManager : province) {
+            list1.add(cityManager.getProvince());
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        model.addAttribute("userType",objectType);
+        HashSet<String> set = new HashSet<String>(list1);
+        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+        wrapper.eq("state",1);
+        List<TSiteType> siteType = siteTypeService.list(wrapper);
+        model.addAttribute("siteType",siteType);
+        model.addAttribute("province",set);
         String roleid = UserExt.getUser().getRoleid();
         model.addAttribute("role",roleid);
-        model.addAttribute("time",byId.getStartTime()+" - "+byId.getEndTime());
-        User byId1 = userMapper.selectById(byId.getStoreStaffId());
-        model.addAttribute("city",byId1);
+        TSite site = siteService.getOne(new QueryWrapper<TSite>().eq("id", id));
+        List<CityManager> city = cityManagerClient.getAccount(site.getCity());
+        List<CityManager> city1 = cityManagerClient.getCity(site.getProvince());
+        ArrayList<String> strings = new ArrayList<>();
+        for (CityManager cityManager : city) {
+            strings.add(cityManager.getCity());
+        }
+        HashSet<String> set1 = new HashSet<String>(strings);
+        List<Store> stores = new ArrayList<>();
+        if (objectType ==2 ){
+            stores= storeClient.getStoreByCityManagerId(objectId);
+        }else if(objectType == 3){
+            stores= storeClient.getStoreByStoreStaffId(objectId);;
+        }else{
+            stores = storeClient.getStore(site.getCity());
+        }
+        List<CityManager> accounts = cityManagerClient.getAccount(site.getCity());
+        model.addAttribute("list",site);
+        Date insuranceEndTime = site.getInsuranceEndTime();
+        String format = new SimpleDateFormat("yyyy-MM-dd").format(insuranceEndTime);
+        model.addAttribute("accounts",accounts);
+        model.addAttribute("time",format);
+        model.addAttribute("city",set1);
+        model.addAttribute("city1",city1);
+        model.addAttribute("type",1);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("stores",stores);
+        return PREFIX + "TSite_edit.html";
+    }
+
+    /**
+     * 跳转到场地锁定页面
+     */
+    @RequestMapping("/lockSite/{id}")
+    public String lockSite(Model model,@PathVariable("id") Integer id) {
+        DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
+        List<TSiteLockDTO> listById = siteLockClient.getListById(id);
+        for (TSiteLockDTO tSiteLockDTO : listById) {
+            tSiteLockDTO.setSsTime(dateformat.format(tSiteLockDTO.getStartTime()));
+            tSiteLockDTO.setEeTime(dateformat.format(tSiteLockDTO.getEndTime()));
+        }
+        model.addAttribute("id",id);
+        model.addAttribute("list",listById);
+        return PREFIX + "TSite_lock.html";
+    }
+    /**
+     * 跳转到场地管理详情页面
+     */
+    @RequestMapping("/openInfoTSite/{id}")
+    public String openInfoTSite(Model model,@PathVariable("id") Integer id) {
+        List<CityManager> province = cityManagerClient.listAll();
+        // 已有城市管理的省
+        ArrayList<String> list1 = new ArrayList<>();
+        // 已有城市管理的市
+        for (CityManager cityManager : province) {
+            list1.add(cityManager.getProvince());
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        model.addAttribute("userType",objectType);
+        HashSet<String> set = new HashSet<String>(list1);
+        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+        wrapper.eq("state",1);
+        List<TSiteType> siteType = siteTypeService.list(wrapper);
+        model.addAttribute("siteType",siteType);
+        model.addAttribute("province",set);
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        TSite site = siteService.getOne(new QueryWrapper<TSite>().eq("id", id));
+        List<CityManager> city = cityManagerClient.getAccount(site.getCity());
+        List<CityManager> city1 = cityManagerClient.getCity(site.getProvince());
+        ArrayList<String> strings = new ArrayList<>();
+        for (CityManager cityManager : city) {
+            strings.add(cityManager.getCity());
+        }
+        HashSet<String> set1 = new HashSet<String>(strings);
+        List<Store> stores = new ArrayList<>();
+        if (objectType ==2 ){
+            stores= storeClient.getStoreByCityManagerId(objectId);
+        }else if(objectType == 3){
+            stores= storeClient.getStoreByStoreStaffId(objectId);;
+        }else{
+            stores = storeClient.getStore(site.getCity());
+        }
+        List<CityManager> accounts = cityManagerClient.getAccount(site.getCity());
+        model.addAttribute("list",site);
+        Date insuranceEndTime = site.getInsuranceEndTime();
+        String format = new SimpleDateFormat("yyyy-MM-dd").format(insuranceEndTime);
+        model.addAttribute("accounts",accounts);
+        model.addAttribute("time",format);
+        model.addAttribute("city",set1);
+        model.addAttribute("city1",city1);
         model.addAttribute("type",0);
-        return PREFIX + "tShop_edit.html";
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("stores",stores);
+        return PREFIX + "TSite_edit.html";
     }
-    @RequestMapping("/tShop_gift/{id}")
-    public String tCityGift(@PathVariable Integer id, Model model) {
-        TStore byId = storeService.getById(id);
-        model.addAttribute("welfarePicture",byId.getWelfarePicture());
-        model.addAttribute("id",id);
-        return PREFIX + "tShop_img.html";
-    }
-    @RequestMapping("/tShop_indexSet/{id}")
-    public String tCityIndexSet(@PathVariable Integer id, Model model) {
-        StoreConfig c1 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,1));
-        model.addAttribute("c1",c1);
-        StoreConfig c2 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,2));
-        model.addAttribute("c2",c2);
-        StoreConfig c3 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,3));
-        model.addAttribute("c3",c3);
-        StoreConfig c4 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,4));
-        model.addAttribute("c4",c4);
-        StoreConfig c5 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,5));
-        model.addAttribute("c5",c5);
-        StoreConfig c6 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,6));
-        model.addAttribute("c6",c6);
-        StoreConfig c7 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,7));
-        model.addAttribute("c7",c7);
-        StoreConfig c8 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,8));
-        model.addAttribute("c8",c8);
-        model.addAttribute("id",id);
-        return PREFIX + "tShop_imgAll.html";
-    }
-
-
-    @RequestMapping(value = "/list")
+    /**
+     * 根据所选门店 获取经营时间
+     */
     @ResponseBody
-    public Object list(String provinceCode, String cityCode , String name, String phone,String shopName) {
-        Page<TStoreListVo> page = new PageFactory<TStoreListVo>().defaultPage();
-        List<TStoreListVo> list =  storeService.listAll(page,provinceCode,cityCode,name,phone,shopName);
-        for (TStoreListVo tStoreListVo : list) {
-            TCityManager byId = cityClient.getById(tStoreListVo.getCityManagerId());
-            tStoreListVo.setAccount(byId.getName()+"-"+byId.getPhone());
-
-        }
-        page.setRecords(list);
-        return  super.packForBT(page);
+    @GetMapping("/getTime/{oneId}")
+    public Store getTime(@PathVariable("oneId") String oneId) {
+        return storeClient.getTime(oneId);
     }
 
-
-    @RequestMapping(value = "/add")
+    /**
+     *  场地管理首页 选择省 返回市
+     */
     @ResponseBody
-    public Object list(TStore tStore,String time,String userName,String userPhone) {
-        try {
-            if(ToolUtil.isNotEmpty(tStore.getProvinceCode())) {
-                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getProvinceCode()));
-                tStore.setProvince(one.getName());
-                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getCityCode()));
-                tStore.setCity(one1.getName());
-            }
-            tStore.setStartTime(time.split(" - ")[0]);
-            tStore.setEndTime(time.split(" - ")[1]);
-            tStore.setState(1);
-            User user = new User();
-            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, userPhone));
-            if(users.size()>0){
-                return "5001";
-            }
-            user.setAccount(userPhone);
-            user.setName(userName);
-            user.setRoleid("2");
-            user.setPhone(userPhone);
-            user.setPassword(SecureUtil.md5("a123456"));
-            userMapper.insert(user);
-            tStore.setStoreStaffId(user.getId());
-            storeService.save(tStore);
-
-            ArrayList<StoreConfig> storeConfigs = new ArrayList<>();
-            for (int i = 1; i < 9; i++) {
-                StoreConfig storeConfig = new StoreConfig();
-                storeConfig.setIsOpen(1);
-                storeConfig.setSort(i);
-                storeConfig.setType(i);
-                storeConfig.setStoreId(tStore.getId());
-                storeConfigs.add(storeConfig);
-            }
-            storeConfigService.saveBatch(storeConfigs);
-            return new SuccessTip<>();
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
+    @RequestMapping(value = "/getChange")
+    public List<Region> getChange(String province) {
+        Region name = regionService.getOne(new QueryWrapper<Region>().eq("name", province));
+        return regionService.list(new QueryWrapper<Region>().eq("parent_id", name.getId()));
     }
-
-    @RequestMapping(value = "/update")
+    /**
+     *  添加场地管理
+     */
     @ResponseBody
-    public Object update(TStore tStore,String time,String userName,String userPhone) {
-        try {
-            TStore byId = storeService.getById(tStore.getId());
-
-            if(ToolUtil.isNotEmpty(tStore.getProvinceCode())) {
-                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getProvinceCode()));
-                tStore.setProvince(one.getName());
-                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getCityCode()));
-                tStore.setCity(one1.getName());
-            }
-            tStore.setStartTime(time.split(" - ")[0]);
-            tStore.setEndTime(time.split(" - ")[1]);
-            if(ToolUtil.isEmpty(tStore.getCoverDrawing())){
-                tStore.setCoverDrawing(byId.getCoverDrawing());
-            }
-            User user = userMapper.selectById(byId.getStoreStaffId());
-            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, userPhone).ne(User::getId,tStore.getStoreStaffId()));
-            if(users.size()>0){
-                return "5001";
-            }
-            user.setAccount(userPhone);
-            user.setName(userName);
-            user.setPhone(userPhone);
-            userMapper.updateById(user);
-            storeService.updateById(tStore);
-            return new SuccessTip<>();
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
+    @RequestMapping(value = "/addSite")
+    public ResultUtil addSite(@RequestBody Site site) {
+        Store store = storeClient.getStoreById(site.getStoreId());
+        String province = store.getProvince();
+        String provinceCode = store.getProvinceCode();
+        String city = store.getCity();
+        String cityCode = store.getCityCode();
+        Integer cityManagerId = store.getCityManagerId();
+        site.setProvince(province);
+        site.setProvinceCode(provinceCode);
+        site.setCity(city);
+        site.setCityCode(cityCode);
+        site.setCityManagerId(cityManagerId);
+        site.setInsertTime(new Date());
+        site.setState(1);
+        siteClient.addSite(site);
+        return ResultUtil.success("添加成功");
     }
+    /**
+     *  编辑场地管理
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateSite")
+    public ResultUtil updateSite(@RequestBody Site site) {
+        if(site.getInsuranceImg().equals("")){
+            site.setInsuranceImg(null);
+        }
+        Store store = storeClient.getStoreById(site.getStoreId());
+
+        String province = store.getProvince();
+        String provinceCode = store.getProvinceCode();
+        String city = store.getCity();
+        String cityCode = store.getCityCode();
+        Integer cityManagerId = store.getCityManagerId();
+
+        site.setProvince(province);
+        site.setProvinceCode(provinceCode);
+        site.setCity(city);
+        site.setCityCode(cityCode);
+        site.setCityManagerId(cityManagerId);
+
+        site.setInsertTime(new Date());
+        site.setState(1);
+        siteClient.addSite(site);
+        return ResultUtil.success();
+    }
+    /**
+     * 场地管理添加页面选择省 展示市
+     */
+    @RequestMapping(value = "/getCity")
+    @ResponseBody
+    public List<CityManager> getCity(String province) {
+
+        return cityManagerClient.getCity(province);
+    }
+    /**
+     * 查询场地管理列表
+     */
+    @RequestMapping(value= "/listAll")
+    @ResponseBody
+    public List<TSiteDTO> listAll(String province,String city,String storeName,Integer siteTypeId,String name) {
+        // 对象类型
+        Integer type = UserExt.getUser().getObjectType();
+        // 对象类型Id
+        Integer objectId = UserExt.getUser().getObjectId();
+        SiteSearchVO vo = new SiteSearchVO();
+        vo.setProvince(province);
+        vo.setCity(city);
+        vo.setStoreName(storeName);
+        vo.setSiteTypeId(siteTypeId);
+        vo.setName(name);
+        vo.setObjectType(type);
+        vo.setObjectId(objectId);
+        return siteClient.listAll(vo);
+    }
+    /**
+     * 查询场地管理列表
+     */
+    @RequestMapping(value= "/listExipre")
+    @ResponseBody
+    public List<TSiteDTO> listExipre(String province,String city,String storeName,Integer siteTypeId,String name) {
+        // 对象类型
+        Integer type = UserExt.getUser().getObjectType();
+        // 对象类型Id
+        Integer objectId = UserExt.getUser().getObjectId();
+        ExpireSiteSearchVO vo = new ExpireSiteSearchVO();
+        vo.setProvince(province);
+        vo.setCity(city);
+        vo.setStoreName(storeName);
+        vo.setSiteTypeId(siteTypeId);
+        vo.setName(name);
+        vo.setObjectType(type);
+        vo.setObjectId(objectId);
+        return siteClient.listExipre(vo);
+    }
+
+    /**
+     * 跳转到添加场地管理
+     */
+    @RequestMapping("/add")
+    public String tCompetitionAdd(Model model) {
+        List<CityManager> province = cityManagerClient.listAll();
+        // 已有城市管理的省
+        ArrayList<String> list1 = new ArrayList<>();
+        // 已有城市管理的市
+        ArrayList<String> list2 = new ArrayList<>();
+        for (CityManager cityManager : province) {
+            list1.add(cityManager.getProvince());
+            list2.add(cityManager.getCity());
+        }
+        Integer objectType = UserExt.getUser().getObjectType();
+        Integer objectId = UserExt.getUser().getObjectId();
+        List<Store> stores = new ArrayList<>();
+        if (objectType ==2 ){
+             stores= storeClient.getStoreByCityManagerId(objectId);
+        }else if(objectType == 3){
+             stores= storeClient.getStoreByStoreStaffId(objectId);;
+        }
+        model.addAttribute("userType",objectType);
+        HashSet<String> set = new HashSet<String>(list1);
+        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+        wrapper.eq("state",1);
+        List<TSiteType> siteType = siteTypeService.list(wrapper);
+        model.addAttribute("siteType",siteType);
+        model.addAttribute("province",set);
+        model.addAttribute("city",list2);
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("objectType",objectType);
+        model.addAttribute("objectId",objectId);
+        model.addAttribute("stores",stores);
+        return PREFIX + "tSite_add.html";
+    }
+
+//    /**
+//     * 跳转到场地管理页面
+//     */
+//    @RequestMapping("/add")
+//    public String tCompetitionAdd(Model model) {
+//        List<CityManager> province = cityManagerClient.listAll();
+//        // 已有城市管理的省
+//        ArrayList<String> list1 = new ArrayList<>();
+//        // 已有城市管理的市
+//        ArrayList<String> list2 = new ArrayList<>();
+//        for (CityManager cityManager : province) {
+//            list1.add(cityManager.getProvince());
+//            list2.add(cityManager.getCity());
+//        }
+//        Integer objectType = UserExt.getUser().getObjectType();
+//        Integer objectId = UserExt.getUser().getObjectId();
+//        List<Store> stores = new ArrayList<>();
+//        if (objectType ==2 ){
+//            stores= storeClient.getStoreByCityManagerId(objectId);
+//        }else if(objectType == 3){
+//            stores= storeClient.getStoreByStoreStaffId(objectId);;
+//        }
+//        model.addAttribute("userType",objectType);
+//        HashSet<String> set = new HashSet<String>(list1);
+//        QueryWrapper<TSiteType> wrapper = new QueryWrapper<>();
+//        wrapper.eq("state",1);
+//        List<TSiteType> siteType = siteTypeService.list(wrapper);
+//        model.addAttribute("siteType",siteType);
+//        model.addAttribute("province",set);
+//        model.addAttribute("city",list2);
+//        String roleid = UserExt.getUser().getRoleid();
+//        model.addAttribute("role",roleid);
+//        model.addAttribute("objectType",objectType);
+//        model.addAttribute("objectId",objectId);
+//        model.addAttribute("stores",stores);
+//        return PREFIX + "tSite_add.html";
+//    }
+
+
     @RequestMapping(value = "/onChange")
     @ResponseBody
     public Object onChange(Integer oneId) {
@@ -269,66 +531,25 @@
             return ERROR;
         }
     }
-    @RequestMapping(value = "/saveImgAll")
+
+    // 选择市后 获取对应账号
+    @RequestMapping(value = "/accountChangeNext")
     @ResponseBody
-    public Object saveImgAll(Integer id,Integer px1,Integer px2,Integer px3,Integer px4,Integer px5,Integer px6,Integer px7,Integer px8,
-                             String c1,String c2,String c3,String c4,String c5,String c6,String c7,String c8,
-                             Integer r1,Integer r2,Integer r3,Integer r4,Integer r5,Integer r6,Integer r7,Integer r8) {
-        try {
-            ArrayList<StoreConfig> storeConfigs = new ArrayList<>();
-            StoreConfig collect1 = collect(id, px1, r1, c1, 1);
-            StoreConfig collect2 = collect(id, px2, r2, c2, 2);
-            StoreConfig collect3 = collect(id, px3, r3, c3, 3);
-            StoreConfig collect4 = collect(id, px4, r4, c4, 4);
-            StoreConfig collect5 = collect(id, px5, r5, c5, 5);
-            StoreConfig collect6 = collect(id, px6, r6, c6, 6);
-            StoreConfig collect7 = collect(id, px7, r7, c7, 7);
-            StoreConfig collect8 = collect(id, px8, r8, c8, 8);
-            storeConfigs.add(collect1);
-            storeConfigs.add(collect2);
-            storeConfigs.add(collect3);
-            storeConfigs.add(collect4);
-            storeConfigs.add(collect5);
-            storeConfigs.add(collect6);
-            storeConfigs.add(collect7);
-            storeConfigs.add(collect8);
-            storeConfigService.updateBatchById(storeConfigs);
-            return new SuccessTip<>();
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
+    public Object accountChangeNext(String oneId) {
+
+        return cityManagerClient.getAccount(oneId);
     }
 
-    private StoreConfig collect(Integer id,Integer sort,Integer isOpen,String img,int type){
-        StoreConfig one = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType, type));
-        one.setSort(sort);
-        one.setIsOpen(isOpen);
-        if(ToolUtil.isNotEmpty(img)){
-            one.setBackgroundImage(img);
-        }
-        return one;
-    }
-    @RequestMapping(value = "/oneChangeNext")
+    // 选择市后 获取对应门店
+    @RequestMapping(value = "/storeChangeNext")
     @ResponseBody
-    public Object oneChangeNext(String oneId) {
-
-        try {
-            CityListQuery cityListQuery = new CityListQuery();
-            cityListQuery.setCityCode(oneId);
-            cityListQuery.setOffset(1);
-            cityListQuery.setLimit(100000);
-            Page<TCityManager> list = cityClient.list(cityListQuery);
-            List<TCityManager> records = list.getRecords();
-            for (TCityManager record : records) {
-                record.setName(record.getName()+"-"+record.getPhone());
-            }
-            return records;
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
+    public Object storeChangeNext(String oneId) {
+        if (oneId.equals("")){
+            return null;
         }
+        return storeClient.getStore(oneId);
     }
+
 
 
     @RequestMapping(value = "/cancel")
@@ -355,50 +576,4 @@
             return ERROR;
         }
     }
-
-    @RequestMapping(value = "/freeze")
-    @ResponseBody
-    public Object freeze(Integer id) {
-        try {
-            TStore byId = storeService.getById(id);
-            byId.setState(2);
-            storeService.updateById(byId);
-            return SUCCESS_TIP;
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
-    }
-    @RequestMapping(value = "/unfreeze")
-    @ResponseBody
-    public Object unfreeze(Integer id) {
-        try {
-            TStore byId = storeService.getById(id);
-            byId.setState(1);
-            storeService.updateById(byId);
-            return SUCCESS_TIP;
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
-    }
-
-    @RequestMapping(value = "/pwd")
-    @ResponseBody
-    public Object pwd(Integer id) {
-        try {
-            TStore byId = storeService.getById(id);
-            User user = userMapper.selectById(byId.getStoreStaffId());
-            user.setPassword(SecureUtil.md5("a123456"));
-            userMapper.updateById(user);
-            return SUCCESS_TIP;
-        }catch (Exception e){
-            e.printStackTrace();
-            return ERROR;
-        }
-    }
-
-
-
-
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java
index c26172d..a0b3d26 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java
@@ -1,28 +1,237 @@
 package com.dsh.guns.modular.system.controller.code;
 
 
+import com.dsh.course.feignClient.activity.BenefitsVideoClient;
+import com.dsh.course.feignClient.activity.model.BenefitsVedioChangeStateVO;
+import com.dsh.course.feignClient.activity.model.BenefitsVideoClassification;
+import com.dsh.course.feignClient.activity.model.BenefitsVideos;
+import com.dsh.course.feignClient.activity.model.QueryBenefitsVedioVO;
+import com.dsh.course.feignClient.course.CourseClient;
+import com.dsh.course.feignClient.course.model.CourseChangeStateDTO;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.modular.system.model.TCourse;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVO;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVideosDTO;
+import com.dsh.guns.modular.system.model.TQueryBenefitsVideosVO;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 福利视频分类 控制器
  */
 
 @Controller
-@RequestMapping("/tWelfareVideo")
+@RequestMapping("/benefits")
 public class TWelfareVideoController {
-
-    private String PREFIX = "/system/tWelfareVideo/";
-
+    private String PREFIX = "/system/benefits/";
+    @Autowired
+    private BenefitsVideoClient benefitsVideoClient;
+    @Autowired
+    private CourseClient courseClient;
     /**
-     * 优惠券审核列表页
+     * 跳转福利视频分类首页
      */
     @RequestMapping("")
+
     public String index(Model model) {
-        return PREFIX + "TWelfareVideo.html";
+        return PREFIX + "TBenefits.html";
+    }
+
+    /**
+     * 跳转福利视频分类添加页面
+     */
+    @RequestMapping("/add")
+
+    public String add(Model model) {
+        return PREFIX + "TBenefits_add.html";
+    }
+
+    /**
+     * 跳转福利视频分类编辑页面--查看详情
+     */
+    @RequestMapping("/info/{id}")
+    public String info(Model model, @PathVariable("id") Integer id) {
+        BenefitsVideoClassification data = benefitsVideoClient.getById(id);
+        model.addAttribute("data",data);
+        model.addAttribute("type",1);
+        return PREFIX + "TBenefits_edit.html";
+    }
+    /**
+     * 跳转福利视频分类编辑页面
+     */
+    @RequestMapping("/update/{id}")
+    public String update(Model model, @PathVariable("id") Integer id) {
+        BenefitsVideoClassification data = benefitsVideoClient.getById(id);
+        model.addAttribute("data",data);
+        model.addAttribute("type",0);
+        return PREFIX + "TBenefits_edit.html";
+    }
+    /**
+     * 跳转视频详情页面
+     */
+    @RequestMapping("/getBenefitsVideos/{courseId}")
+    public String getBenefitsVideos(Model model, @PathVariable("courseId") Integer id) {
+        model.addAttribute("id",id);
+        return PREFIX + "TBenefitsVideos.html";
+    }
+    /**
+     * 跳转视频详情添加页面
+     * @param id 福利视频分类id
+     */
+    @RequestMapping("/addBenefitsVideos/{id}")
+    public String addBenefitsVideos(Model model,@PathVariable("id")Integer id) {
+        model.addAttribute("id",id);
+        List<BenefitsVideos> benefitVideoById = benefitsVideoClient.getBenefitVideoById(id);
+//        // 所选福利视频分类下的视频的courseId集合
+//        List<Integer> list = new ArrayList<>();
+//        for (BenefitsVideos benefitsVideos : benefitVideoById) {
+//            list.add(benefitsVideos.getCourseId());
+//        }
+        TQueryBenefitsVideosDTO dto = new TQueryBenefitsVideosDTO();
+//        dto.setCoursIds(list);
+        List<TQueryBenefitsVideosVO> courseByCourseIds = courseClient.getCourseByCourseIds(dto);
+        List<TQueryBenefitsVideosVO> tQueryBenefitsVideosVOS = new ArrayList<>();
+        for (TQueryBenefitsVideosVO courseByCourseId : courseByCourseIds) {
+            if (courseByCourseId.getType()!=1){
+                tQueryBenefitsVideosVOS.add(courseByCourseId);
+            }
+        }
+        model.addAttribute("data",tQueryBenefitsVideosVOS);
+        return PREFIX + "TBenefitsVideos_add.html";
+    }
+
+    /**
+     * 跳转视频详情编辑页面
+     */
+    @RequestMapping("/infoBenefitsVideos/{id}/{type}/{benefitsVideosId}")
+    public String infoBenefitsVideos(Model model, @PathVariable("id") Integer id,@PathVariable("type") Integer type,@PathVariable("benefitsVideosId") Integer benefitsVideosId) {
+        TQueryBenefitsVideosVO tQueryBenefitsVideosVO = new TQueryBenefitsVideosVO();
+        BenefitsVideos benefitVideosById = benefitsVideoClient.getBenefitVideosById(benefitsVideosId);
+        TCourse tCourse = courseClient.queryCourseById(id);
+        BeanUtils.copyProperties(tCourse,tQueryBenefitsVideosVO);
+        tQueryBenefitsVideosVO.setIntegral(benefitVideosById.getIntegral());
+        tQueryBenefitsVideosVO.setBenefitsVideosId(benefitVideosById.getId());
+        model.addAttribute("data",tQueryBenefitsVideosVO);
+        model.addAttribute("type",type);
+        return PREFIX + "TBenefitsVideos_edit.html";
+    }
+
+    /**
+     * 根据所选视频 获取视频封面用于前端显示
+     */
+    @RequestMapping("/getCoverDrawing/{id}")
+    @ResponseBody
+    public TCourse infoBenefitsVideos( @PathVariable("id") Integer id) {
+        TCourse tCourse = courseClient.queryCourseById(id);
+        return tCourse;
     }
 
 
+    /**
+     * 查询福利视频分类列表
+     */
+    @RequestMapping(value= "/list")
+    @ResponseBody
+    public List<TQueryBenefitsVO> listAll(String name, Integer position) {
+        // 对象类型
+        Integer type = UserExt.getUser().getObjectType();
+        // 对象类型Id
+        Integer objectId = UserExt.getUser().getObjectId();
+        QueryBenefitsVedioVO vo = new QueryBenefitsVedioVO();
+        vo.setName(name);
+        vo.setPosition(position);
+        return benefitsVideoClient.listAll(vo);
+    }
+
+    /**
+     * 查询视频详情列表
+     */
+    @RequestMapping(value= "/listBenefitsVideos/{id}")
+    @ResponseBody
+    public List<TQueryBenefitsVideosVO> listBenefitsVideos(@PathVariable("id")Integer bId, String name, Integer type, Integer state) {
+        TQueryBenefitsVideosDTO vo = new TQueryBenefitsVideosDTO();
+        List<BenefitsVideos> benefitVideoById = benefitsVideoClient.getBenefitVideoById(bId);
+        vo.setCoursIds(new ArrayList<>());
+        for (BenefitsVideos benefitsVideos : benefitVideoById) {
+            // 获取课程id集合
+            vo.getCoursIds().add(benefitsVideos.getCourseId());
+        }
+        if (benefitVideoById.size()==0){
+            return new ArrayList<>();
+        }
+        vo.setName(name);
+        vo.setType(type);
+        vo.setState(state);
+        List<TQueryBenefitsVideosVO> courseByCourseIds = courseClient.getCourseByCourseIds(vo);
+        for (BenefitsVideos benefitsVideos : benefitVideoById) {
+            for (TQueryBenefitsVideosVO courseByCourseId : courseByCourseIds) {
+                if (benefitsVideos.getCourseId() == courseByCourseId.getId()){
+                    courseByCourseId.setIntegral(benefitsVideos.getIntegral());
+                    courseByCourseId.setBenefitsVideosId(benefitsVideos.getId());
+                }
+            }
+        }
+        return courseByCourseIds;
+    }
+    /**
+     * 添加福利视频分类
+     */
+    @RequestMapping(value= "/addBenefits")
+    @ResponseBody
+    public Object addBenefits(@RequestBody BenefitsVideoClassification bvcf) {
+        bvcf.setState(1);
+        bvcf.setInsertTime(new Date());
+        return benefitsVideoClient.addSite(bvcf);
+    }
+
+    /**
+     * 添加视频详情
+     */
+    @RequestMapping(value= "/addBenefitsVideos")
+    @ResponseBody
+    public Object addBenefitsVideos(@RequestBody BenefitsVideos bvcf) {
+        if (bvcf.getId()!=null){
+            return benefitsVideoClient.addBenefitsVideos(bvcf);
+        }else {
+        bvcf.setState(1);
+        bvcf.setInsertTime(new Date());
+        return benefitsVideoClient.addBenefitsVideos(bvcf);
+        }
+    }
+
+    /**
+     * 福利视频分类上/下架 1为上架 2为下架 3为删除
+     *
+     * @return
+     */
+    @RequestMapping("/changeState")
+    @ResponseBody
+    public Object changeState(@RequestBody BenefitsVedioChangeStateVO vo){
+        benefitsVideoClient.changeState(vo);
+        return ResultUtil.success();
+    }
+
+    /**
+     * 视频详情上/下架 1为上架 2为下架 3为删除
+     *
+     * @return
+     */
+    @RequestMapping("/changeCourseState")
+    @ResponseBody
+    public Object changeCourseState(@RequestBody CourseChangeStateDTO dto){
+        courseClient.changeState(dto);
+        return ResultUtil.success();
+    }
 
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java
index d1998b7..4ff330d 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java
@@ -101,6 +101,8 @@
         User byId = userService.getById(user.getId());
         //获取用户头像 Obtain user profile
         String avatar = byId.getAvatar();
+        Integer objectType = user.getObjectType();
+
         model.addAttribute("roleNames", role.getName());
         model.addAttribute("language", language);
         model.addAttribute("avatar", avatar);
@@ -113,8 +115,9 @@
         return "/index.html";
     }
 
+
     /**
-     * 跳转到登录页面
+     * 跳转到场地管理页面
      */
     @RequestMapping(value = "/login", method = RequestMethod.GET)
     public String login() {
@@ -124,7 +127,6 @@
             return "/login.html" ;
         }
     }
-
     /**
      * 点击登录执行的动作
      */
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java
index 4036e64..9824b5b 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java
@@ -140,6 +140,7 @@
         return pictureName;
     }
 
+
     /**
      * UEditor编辑器上传图片
      */
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java
index 71aa0f5..dcf351f 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java
@@ -8,7 +8,6 @@
  * @Date 2023/02/15 9:42
  */
 public enum RuleStatusEnum {
-
     NOT_START(1, "未开始"),
     STARTED(2, "已开始"),
     ENDED(3, "已结束"),
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java
new file mode 100644
index 0000000..013c719
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java
@@ -0,0 +1,11 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CoachChangeStateVO {
+    private List<Integer> ids;
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java
new file mode 100644
index 0000000..17f55b5
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java
@@ -0,0 +1,13 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class CoachQuery {
+    private String province;
+    private String city;
+    private String name;
+    private String phone;
+    // 编辑页面回显使用
+    private Integer id;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java
new file mode 100644
index 0000000..631c990
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java
@@ -0,0 +1,40 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class ExpireSiteSearchVO {
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 场地类型
+     */
+    private Integer siteTypeId;
+
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 对象类型(1=平台,2=城市管理员,3=门店)
+     */
+    private Integer objectType;
+
+    private Integer objectId;
+
+    // 登陆人类型
+    private Integer typeId ;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java
new file mode 100644
index 0000000..9585780
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java
@@ -0,0 +1,37 @@
+package com.dsh.guns.modular.system.model;
+
+
+import lombok.Data;
+
+@Data
+public class SiteSearchVO {
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 场地类型
+     */
+    private Integer siteTypeId;
+
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 对象类型(1=平台,2=城市管理员,3=门店)
+     */
+    private Integer objectType;
+
+    private Integer objectId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java
new file mode 100644
index 0000000..7ecadfa
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java
@@ -0,0 +1,139 @@
+package com.dsh.guns.modular.system.model;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 门店信息
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_store")
+public class Store extends Model<Store> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 门店店长id
+     */
+    @TableField("storeStaffId")
+    private Integer storeStaffId;
+    /**
+     * 城市管理员id
+     */
+    @TableField("cityManagerId")
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 联系电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 详细地址
+     */
+    @TableField("address")
+    private String address;
+    /**
+     * 纬度
+     */
+    @TableField("lat")
+    private String lat;
+    /**
+     * 经度
+     */
+    @TableField("lon")
+    private String lon;
+    /**
+     * 营业开始时间
+     */
+    @TableField("startTime")
+    private String startTime;
+    /**
+     * 营业结束时间
+     */
+    @TableField("endTime")
+    private String endTime;
+    /**
+     * 封面图
+     */
+    @TableField("coverDrawing")
+    private String coverDrawing;
+    /**
+     * 实景图
+     */
+    @TableField("realPicture")
+    private String realPicture;
+    /**
+     * 门店介绍
+     */
+    @TableField("introduce")
+    private String introduce;
+    /**
+     * 福利图片
+     */
+    @TableField("welfarePicture")
+    private String welfarePicture;
+    /**
+     * 评分
+     */
+    @TableField("score")
+    private BigDecimal score;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java
new file mode 100644
index 0000000..7228cfb
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java
@@ -0,0 +1,18 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+/**
+ * 福利视频分类列表查询返回VO
+ */
+@Data
+public class TQueryBenefitsVO {
+    private Integer id;
+    private String name;
+    // 位置(1=线上课得积分,2=看视频得奖励)
+    private Integer position;
+    private Integer sort;
+    private Integer count;
+    private Integer state;
+    private Integer courseId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java
new file mode 100644
index 0000000..0f5664b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java
@@ -0,0 +1,20 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 接收视频详情列表查询参数DTO
+ */
+@Data
+public class TQueryBenefitsVideosDTO {
+    // 课程id
+    private List<Integer> coursIds;
+    // 视频名称
+    private String name;
+    // 视频类型
+    private Integer type;
+    // 1上架 2下架 3已失效
+    private Integer state;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java
new file mode 100644
index 0000000..293498f
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java
@@ -0,0 +1,26 @@
+package com.dsh.guns.modular.system.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频详情列表查询返回VO
+ */
+@Data
+public class TQueryBenefitsVideosVO {
+    private Integer id;
+    private String name;
+    private String introduce;
+    private String coverDrawing;
+    private String introductionDrawing;
+    private String courseVideo;
+    private Integer state;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+    private Integer integral;
+    private Integer type;
+    private Integer benefitsVideosId;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java
index 74fcdef..8e9fd3f 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -84,6 +85,7 @@
      * 场地责任险有效期
      */
     @TableField("insuranceEndTime")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date insuranceEndTime;
     /**
      * 场地责任险图片
@@ -104,5 +106,6 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date insertTime;
 }
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html b/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html
index c715826..b5425c9 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html
@@ -32,9 +32,9 @@
         </nav>-->
         <button class="roll-nav roll-right J_tabRight"><i class="fa fa-forward"></i>
         </button>
+
         <div class="btn-group roll-nav roll-right">
             <button class="dropdown J_tabClose" data-toggle="dropdown">关闭操作<span class="caret"></span>
-
             </button>
             <ul role="menu" class="dropdown-menu dropdown-menu-right">
                 <li class="J_tabShowActive"><a>定位当前选项卡</a>
@@ -55,4 +55,21 @@
         <div class="pull-right">&copy; 2019-2023 <a href="#" onclick="return false" target="_blank">玩湃</a>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
+<script src="${ctxPath}/js/common/Feng.js"></script>
+<script type="text/javascript">
+    function getSite(){
+        // var ajax = new $ax(Feng.ctxPath + "/tSite/expireInsuranceEndTime", function(data){
+        // });
+        // ajax.start();
+        $.ajax({
+            url: Feng.ctxPath + "/tSite/expireInsuranceEndTime",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            success: function(response) {
+                           },
+            error: function(xhr, status, error) {
+            }
+        });
+    }
+</script>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html
new file mode 100644
index 0000000..8535db1
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html
@@ -0,0 +1,71 @@
+@layout("/common/_container.html"){
+<style>
+    .data-item {
+        position: relative;
+        border: 1px solid #ccc;
+        padding: 10px;
+        margin-bottom: 10px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        max-width: 200px;
+        margin-right: 10px;
+    }
+
+    .delete-button {
+        position: absolute;
+        top: -10px;
+        right: -10px;
+        cursor: pointer;
+        color: black;
+        width: 20px;
+        height: 20px;
+        text-align: center;
+        line-height: 20px;
+        border-radius: 50%;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>视频分类管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="分类名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="position" name="所在位置" >
+                                <option value="">全部</option>
+                                <option value="1">线上课得积分</option>
+                                <option value="2">看视频得奖励</option>
+                            </#SelectCon>
+                        </div>
+        <div class="col-sm-3">
+            <#button name="搜索" icon="fa-search" clickFun="TQuestion.search()"/>
+            <#button name="重置" icon="fa-trash" clickFun="TQuestion.resetSearch()"/>
+        </div>
+                        </div>
+                        <div class="hidden-xs" id="TCouponTableToolbar" role="group">
+                            <#button name="添加" icon="fa-plus" clickFun="TQuestion.openAdd()"/>
+                            <#button name="编辑" icon="fa-edit" clickFun="TQuestion.openChange()" space="true"/>
+                            <#button name="删除" icon="fa-remove" clickFun="TQuestion.delete()" space="true"/>
+                            <#button name="上架" icon="fa-check" clickFun="TQuestion.onShelf()" space="true"/>
+                            <#button name="下架" icon="fa-remove" clickFun="TQuestion.offShelf()" space="true"/>
+                            <#button name="查看详情" icon="fa-search" clickFun="TQuestion.getInfo()" space="true"/>
+                            <#button name="视频详情" icon="fa-search" clickFun="TQuestion.getInfo()" space="true"/>
+                        </div>
+                        <#table id="TQuestionTable"/>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/benefits/TBenefits.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html
new file mode 100644
index 0000000..28d803e
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html
@@ -0,0 +1,79 @@
+@layout("/common/_container.html"){
+<style>
+    .data-item {
+        position: relative;
+        border: 1px solid #ccc;
+        padding: 10px;
+        margin-bottom: 10px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        max-width: 200px;
+        margin-right: 10px;
+    }
+
+    .delete-button {
+        position: absolute;
+        top: -10px;
+        right: -10px;
+        cursor: pointer;
+        color: black;
+        width: 20px;
+        height: 20px;
+        text-align: center;
+        line-height: 20px;
+        border-radius: 50%;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <input hidden id="id" value="${id}">
+            <div class="ibox-title">
+                <h5>视频详情</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="视频名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="position" name="视频类型" >
+                                <option value="">全部</option>
+                                <option value="2">运动教学视频</option>
+                                <option value="3">器材教学视频</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="state" name="状态" >
+                            <option value="">全部</option>
+                            <option value="1">上架</option>
+                            <option value="2">下架</option>
+                            <option value="3">已失效</option>
+                        </#SelectCon>
+                    </div>
+        <div class="col-sm-3">
+            <#button name="搜索" icon="fa-search" clickFun="TQuestion.search()"/>
+            <#button name="重置" icon="fa-trash" clickFun="TQuestion.resetSearch()"/>
+        </div>
+                        </div>
+                        <div class="hidden-xs" id="TCouponTableToolbar" role="group">
+                            <#button name="添加" icon="fa-plus" clickFun="TQuestion.openAdd()"/>
+                            <#button name="编辑" icon="fa-edit" clickFun="TQuestion.openChange()" space="true"/>
+                            <#button name="删除" icon="fa-remove" clickFun="TQuestion.delete()" space="true"/>
+                            <#button name="上架" icon="fa-check" clickFun="TQuestion.onShelf()" space="true"/>
+                            <#button name="下架" icon="fa-remove" clickFun="TQuestion.offShelf()" space="true"/>
+                            <#button name="查看详情" icon="fa-search" clickFun="TQuestion.getInfo()" space="true"/>
+                        </div>
+                        <#table id="TQuestionTable"/>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/benefits/tBenefitsVideos.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html
new file mode 100644
index 0000000..b187657
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html
@@ -0,0 +1,104 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="id" value="${id}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*视频名称:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="name" name = "name" onchange="TQuestion.oneChange()">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择</option>
+                        @for(obj in data){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*视频封面:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <img id="img" src="" width="150px" height="150px">
+<!--                    <#avatar id="img" name="" avatarImg=""/>-->
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*视频简介:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <textarea readonly id="introduce" rows="10" COLS="30" placeholder="请输入视频简介"></textarea>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*可获积分:</label>
+                <!-- <input style="width: 300px" class="form-control"  type="time">-->
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" placeholder="请输入可获得积分" id="integral" class="form-control" type="text">
+                </div>
+            </div>
+
+
+
+             </div>
+         </div>
+</div>
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5" >
+        <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TQuestion.addSubmit()"/>
+        <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+    </div>
+</div>
+
+        </div>
+        </div>
+
+    </div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/benefits/tBenefitsVideos_add.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html
new file mode 100644
index 0000000..07a38df
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html
@@ -0,0 +1,124 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="benefitsVideosId" value="${data.benefitsVideosId}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            @if(type == 1){
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*视频类型:</label>
+                <div class="col-sm-9">
+                    <input style="width: 300px;" value="${data.type == 2 ? '运动教学视频' : '器材教学视频'}"  id="type" class="form-control" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*视频名称:</label>
+                <!-- <input style="width: 300px" class="form-control"  type="time">-->
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" value="${data.name}"  id="name" class="form-control" type="text">
+                </div>
+            </div>
+            @}
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*可获积分:</label>
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" placeholder="请输入可获得积分" id="integral" value="${data.integral}" class="form-control" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*视频简介:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <textarea readonly id="introduce" rows="10" COLS="30" value="${data.introduce}" placeholder="请输入视频简介">${data.introduce}</textarea>
+                </div>
+            </div>
+
+            @if(type == 1){
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*视频封面:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <img id="coverDrawing" src="${data.coverDrawing}" width="150px" height="150px">
+                    <!--                    <#avatar id="img" name="" avatarImg=""/>-->
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*视频介绍:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <img id="introductionDrawing" src="${data.introductionDrawing}" width="150px" height="150px">
+                    <!--                    <#avatar id="img" name="" avatarImg=""/>-->
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*视频内容:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <img id="courseVideo" src="" width="150px" height="150px">
+                    <!--                    <#avatar id="img" name="" avatarImg=""/>-->
+                </div>
+            </div>
+            @}
+
+             </div>
+         </div>
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5" >
+        @if(type != 1){
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TQuestion.updateVideosSubmit()"/>
+        @}
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+    </div>
+</div>
+
+        </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/benefits/tBenefitsVideos_add.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+
+
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html
new file mode 100644
index 0000000..4e7789d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html
@@ -0,0 +1,233 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="objectType" value="${objectType}">
+    <input hidden id="objectId" value="${objectId}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="role" value="${role}">
+            @if(objectType==1){
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange()">
+                        <option value="">请选择省</option>
+                        @for(obj in list){
+                        <option style="width: 300px" value="${obj.provinceCode}">${obj.province}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TSite.oneChangeNext(this)">
+                        <option value="">请选择市</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属账号:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="account" name="account">
+                        <option value="" style="color: #676A6C" disabled selected>请选择所属账号</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*教练类型:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="coachTypeId" name = "typeId">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择教练类型</option>
+                        @for(obj in coachType){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="name"  placeholder="请输入姓名" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*生日:</label>
+                <!-- <input style="width: 300px" class="form-control"  type="time">-->
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" placeholder="请选择" id="birthday" class="form-control" type="date">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*性别:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="gender" name = "gender">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择性别</option>
+                        <option value="1">男</option>
+                        <option value="2">女</option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*联系电话:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="phone"  placeholder="请输入联系电话" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身份证号:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="idcard"  placeholder="请输入身份证号" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身高:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="height"  placeholder="请输入身高" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">cm</span>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*体重:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="weight"  placeholder="请输入体重" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">kg</span>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*毕业院校:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="graduateSchool"  placeholder="请输入毕业院校" type="text">
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*照片:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <#avatar id="img" name="" avatarImg=""/>
+                </div>
+            </div>
+
+         <div class="row" id="app1" >
+             <div class="col-sm-6" style="width: 100%">
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*资格证书: </label>
+                <input style="width: 300px" class="form-control" id="certificate"  placeholder="请输入资格证书" type="text">
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label"></label>
+                <div class="col-sm-9">
+                    <el-upload
+                            :limit="5"
+                            class="avatar-uploader"
+                            action="/tCouponManage/uploadPic"
+                            list-type="picture-card"
+                            accept=".jpg,.jpeg,.png,.JPG,.JPEG"
+                            :on-success="handleAvatarSuccess"
+                            :on-remove="handleRemove">
+                        <i class="el-icon-plus"></i>
+                    </el-upload>
+                    <el-dialog :visible.sync="dialogVisible">
+                        <img width="100%" :src="imageUrl1" alt=""></el-dialog>
+                </div>            </div>
+
+             </div>
+         </div>
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5" >
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/>
+    </div>
+</div>
+
+        </div>
+        </div>
+
+    </div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/tCoach/tCoach_add.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TSite.goodsPicArray.push(res);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TSite.goodsPicArray = TSite.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html
new file mode 100644
index 0000000..6392d54
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html
@@ -0,0 +1,86 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*分类名称:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="name"  placeholder="请输入分类名称" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所在位置:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="position" name = "gender">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择所在位置</option>
+                        <option value="1">线上课得积分</option>
+                        <option value="2">看视频得奖励</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*排序:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="sort"  placeholder="请输入排序" type="text">
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5" >
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TQuestion.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/benefits/TBenefits.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html
new file mode 100644
index 0000000..a32ad0f
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html
@@ -0,0 +1,91 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="dataId" value="${data.id}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*分类名称:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" value="${data.name}" id="name"  placeholder="请输入分类名称" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所在位置:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="position" name = "gender">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择所在位置</option>
+                        <option value="1" ${data.position == 1 ? 'selected' : ''}>线上课得积分</option>
+                        <option value="2" ${data.position == 2 ? 'selected' : ''}>看视频得奖励</option>
+
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*排序:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="sort" value="${data.sort}"  placeholder="请输入排序" type="text">
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5" >
+                    @if(type!=1){
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TQuestion.updateSubmit()"/>
+                    @}
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+                </div>
+            </div>
+
+        </div>
+    </div>
+
+</div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/benefits/TBenefits.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html
new file mode 100644
index 0000000..383eb7b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html
@@ -0,0 +1,79 @@
+@layout("/common/_container.html"){
+<style>
+    .data-item {
+        position: relative;
+        border: 1px solid #ccc;
+        padding: 10px;
+        margin-bottom: 10px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        max-width: 200px;
+        margin-right: 10px;
+    }
+
+    .delete-button {
+        position: absolute;
+        top: -10px;
+        right: -10px;
+        cursor: pointer;
+        color: black;
+        width: 20px;
+        height: 20px;
+        text-align: center;
+        line-height: 20px;
+        border-radius: 50%;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>视频分类管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="parentName" name="家长姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="家长联系方式" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                <option value="">全部</option>
+                                <option value="1">未体测</option>
+                                <option value="2">已体测</option>
+                            </#SelectCon>
+                        </div>
+
+        <div class="col-sm-3">
+            <#button name="搜索" icon="fa-search" clickFun="TQuestion.search()"/>
+            <#button name="重置" icon="fa-trash" clickFun="TQuestion.resetSearch()"/>
+        </div>
+                        </div>
+                    <div class="hidden-xs" style="margin-top: 10px"  role="group">
+                        <label>预约时间:</label>
+                        <#button name="今日" icon="fa-search" clickFun="TQuestion.day(1)"/>
+                        <#button name="明日" icon="fa-search" clickFun="TQuestion.day(2)"/>
+                        <#button name="最近7天" icon="fa-search" clickFun="TQuestion.day(7)"/>
+                    </div>
+
+                        <div style="margin-top: 10px" class="hidden-xs" id="TCouponTableToolbar" role="group">
+                            <#button name="添加" icon="fa-plus" clickFun="TQuestion.openAdd()"/>
+                            <#button name="编辑" icon="fa-edit" clickFun="TQuestion.openChange()" space="true"/>
+                            <#button name="已测试" icon="fa-check" clickFun="TQuestion.onShelf()" space="true"/>
+
+                        </div>
+                        <#table id="TQuestionTable"/>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/bodySideAppointment/tBodySideAppointment.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html
new file mode 100644
index 0000000..a58bfe3
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html
@@ -0,0 +1,133 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TQuestion.oneChange()">
+                        <option value="">请选择省</option>
+                        @for(obj in list){
+                        <option style="width: 300px" value="${obj.provinceCode}">${obj.province}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TQuestion.oneChangeNext(this)">
+                        <option value="">请选择市</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属门店:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="store" name="account">
+                        <option value="" style="color: #676A6C" disabled selected>请选择门店</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*家长姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="parentName"  placeholder="请输入家长姓名" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*家长联系方式:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="phone"  placeholder="请输入家长联系方式" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*学员姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="learnerName"  placeholder="请输入学员姓名" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*学员年龄:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="learnerAge"  placeholder="请输入学员年龄" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*学员生日:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="birthday"  placeholder="请选择" type="date">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*预约时间:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="appointmentTime"  placeholder="请选择" type="datetime-local">
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5" >
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TQuestion.addSubmit()"/>
+                    <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/bodySideAppointment/tBodySideAppointment.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html
new file mode 100644
index 0000000..550be62
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html
@@ -0,0 +1,91 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="dataId" value="${data.id}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*家长姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" value="${data.name}" id="name"  placeholder="请输入分类名称" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所在位置:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="position" name = "gender">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择所在位置</option>
+                        <option value="1" ${data.position == 1 ? 'selected' : ''}>线上课得积分</option>
+                        <option value="2" ${data.position == 2 ? 'selected' : ''}>看视频得奖励</option>
+
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*排序:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="sort" value="${data.sort}"  placeholder="请输入排序" type="text">
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5" >
+                    @if(type!=1){
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TQuestion.updateSubmit()"/>
+                    @}
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TQuestion.close()"/>
+                </div>
+            </div>
+
+        </div>
+    </div>
+
+</div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/benefits/TBenefits.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html
new file mode 100644
index 0000000..4b6ef47
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>课包类型管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                        </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="添加" icon="fa-plus" clickFun="TSite.openAddTSite()"/>
+                    <#button name="编辑" icon="fa-edit" clickFun="TSite.openTSiteDetail()" space="true"/>
+                    <#button name="删除" icon="fa-remove" clickFun="TSite.del()" space="true"/>
+                </div>
+                <#table id="TSiteTable"/>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackageType/coursePackageType.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html
new file mode 100644
index 0000000..147237a
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html
@@ -0,0 +1,80 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+
+            <div class="ibox-title">
+                <h5>教练管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            @if(objectType==1){
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                    <div class="input-group-btn open">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                            所在省
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="pCode" onchange="TSite.oneChange()">
+                                        <option value="">全部</option>
+                                        @for(obj in data){
+                                        <option value="${obj.provinceCode}">${obj.province}</option>
+                                        @}
+                                    </select>
+                                </div>
+                            </div>
+                            @}
+                            @if(objectType==1){
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                <div class="input-group-btn open">
+                                    <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                        所在市
+                                    </button>
+                                </div>
+                                <select class="form-control" id="cCode">
+                                    <option value="">请先选择省</option>
+                                </select>
+                                 </div>
+                            </div>
+                            @}
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名:" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="联系电话:" />
+                            </div>
+
+                    <div class="col-sm-3">
+                        <#button name="搜索" icon="fa-search" clickFun="TSite.search()"/>
+                        <#button name="重置" icon="fa-trash" clickFun="TSite.resetSearch()" space="true"/>
+                    </div>
+                </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="添加" icon="fa-plus" clickFun="TSite.openAddTSite()"/>
+                    <#button name="编辑" icon="fa-edit" clickFun="TSite.openEditTSite()" space="true"/>
+                    <#button name="解冻" icon="fa-check" clickFun="TSite.onShelf()" space="true"/>
+                    <#button name="冻结" icon="fa-remove" clickFun="TSite.offShelf()" space="true"/>
+                    <#button name="查看详情" icon="fa-search" clickFun="TSite.openInfo()" space="true"/>
+                </div>
+                <#table id="TSiteTable"/>
+            </div>
+        </div>
+    </div>
+            <input hidden id="objectType" value="${objectType}">
+            <input hidden id="objectId" value="${objectId}">
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/tCoach/tCoach.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html
new file mode 100644
index 0000000..4e7789d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html
@@ -0,0 +1,233 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="objectType" value="${objectType}">
+    <input hidden id="objectId" value="${objectId}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="role" value="${role}">
+            @if(objectType==1){
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange()">
+                        <option value="">请选择省</option>
+                        @for(obj in list){
+                        <option style="width: 300px" value="${obj.provinceCode}">${obj.province}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TSite.oneChangeNext(this)">
+                        <option value="">请选择市</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属账号:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="account" name="account">
+                        <option value="" style="color: #676A6C" disabled selected>请选择所属账号</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*教练类型:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="coachTypeId" name = "typeId">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择教练类型</option>
+                        @for(obj in coachType){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="name"  placeholder="请输入姓名" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*生日:</label>
+                <!-- <input style="width: 300px" class="form-control"  type="time">-->
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" placeholder="请选择" id="birthday" class="form-control" type="date">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*性别:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="gender" name = "gender">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择性别</option>
+                        <option value="1">男</option>
+                        <option value="2">女</option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*联系电话:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="phone"  placeholder="请输入联系电话" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身份证号:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="idcard"  placeholder="请输入身份证号" type="text">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身高:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="height"  placeholder="请输入身高" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">cm</span>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*体重:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="weight"  placeholder="请输入体重" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">kg</span>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*毕业院校:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="graduateSchool"  placeholder="请输入毕业院校" type="text">
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*照片:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <#avatar id="img" name="" avatarImg=""/>
+                </div>
+            </div>
+
+         <div class="row" id="app1" >
+             <div class="col-sm-6" style="width: 100%">
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*资格证书: </label>
+                <input style="width: 300px" class="form-control" id="certificate"  placeholder="请输入资格证书" type="text">
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label"></label>
+                <div class="col-sm-9">
+                    <el-upload
+                            :limit="5"
+                            class="avatar-uploader"
+                            action="/tCouponManage/uploadPic"
+                            list-type="picture-card"
+                            accept=".jpg,.jpeg,.png,.JPG,.JPEG"
+                            :on-success="handleAvatarSuccess"
+                            :on-remove="handleRemove">
+                        <i class="el-icon-plus"></i>
+                    </el-upload>
+                    <el-dialog :visible.sync="dialogVisible">
+                        <img width="100%" :src="imageUrl1" alt=""></el-dialog>
+                </div>            </div>
+
+             </div>
+         </div>
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5" >
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/>
+    </div>
+</div>
+
+        </div>
+        </div>
+
+    </div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/tCoach/tCoach_add.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TSite.goodsPicArray.push(res);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TSite.goodsPicArray = TSite.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html
new file mode 100644
index 0000000..1c96079
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html
@@ -0,0 +1,227 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="objectType" value="${objectType}">
+    <input hidden id="objectId" value="${objectId}">
+    <input hidden id="dataId" value="${data.id}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="role" value="${role}">
+            @if(objectType==1){
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange()">
+                        @for(obj in list){
+                        <option value="${obj.provinceCode}" ${obj.province == data.province ? 'selected=selected' : ''}>${obj.province}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TSite.oneChangeNext(this)">
+                        @for(obj in city){
+                        <option value="${obj.cityCode}" ${obj.city == data.city ? 'selected=selected' : ''}>${obj.city}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*所属账号:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="account" name="account">
+                        @for(obj in cityManagers){
+                        <option value="${obj.id}" ${obj.id == data.cityManagerId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*教练类型:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="coachTypeId" name = "typeId">
+                        <option value="" style="color: #b6b6b6" disabled selected>请选择教练类型</option>
+                        @for(obj in coachType){
+                        <option value="${obj.id}" ${obj.id == data.coachTypeId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*姓名:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="name" value="${data.name}"  placeholder="请输入姓名" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*生日:</label>
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 300px;" placeholder="请选择" value="${birthday}" id="birthday" class="form-control" type="date">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*性别:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px"  class="form-control" id="gender" name = "gender">
+                        <option value="1" ${data.gender == 1 ? 'selected' : ''}>男</option>
+                        <option value="2" ${data.gender == 2 ? 'selected' : ''}>女</option>
+                    </select>
+                </div>
+            </div>
+
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*联系电话:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" value="${data.phone}" id="phone"  placeholder="请输入联系电话" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身份证号:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="idcard" value="${data.idcard}"  placeholder="请输入身份证号" type="text">
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*身高:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="height" value="${data.height}"  placeholder="请输入身高" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">cm</span>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*体重:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" value="${data.weight}" id="weight"  placeholder="请输入体重" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">kg</span>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*毕业院校:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" value="${data.graduateSchool}" id="graduateSchool"  placeholder="请输入毕业院校" type="text">
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*照片:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <#avatar id="img" avatarImg="${data.diploma}" name="" />
+                </div>
+            </div>
+
+
+            <div class="row" id="app1" >
+                <div class="col-sm-6" style="width: 100%">
+                    <div class="form-group" >
+                        <label class="col-sm-3 control-label">*资格证书: </label>
+                        <input style="width: 300px" class="form-control" id="certificate" value="${data.certificate}"  placeholder="请输入资格证书" type="text">
+                    </div>
+                    <div class="form-group" >
+                        <label class="col-sm-3 control-label"></label>
+                        <div class="col-sm-9">
+                            <el-upload
+                                    :limit="5"
+                                    class="avatar-uploader"
+                                    action="/tCouponManage/uploadPic"
+                                    list-type="picture-card"
+                                    accept=".jpg,.jpeg,.png,.JPG,.JPEG"
+                                    :on-success="handleAvatarSuccess"
+                                    :on-remove="handleRemove">
+                                <i class="el-icon-plus"></i>
+                            </el-upload>
+                            <el-dialog :visible.sync="dialogVisible">
+                                @for(img in pictures){
+                                <img width="100%" src="${img}">
+                                @}
+                                </el-dialog>
+                        </div>            </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5" >
+                    @if(type!=1){
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit()"/>
+                    @}
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+
+<script src="${ctxPath}/modular/system/tCoach/tCoach_add.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TSite.goodsPicArray.push(res);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TSite.goodsPicArray = TSite.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html
new file mode 100644
index 0000000..e3e8440
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>教练类型管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                        </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="添加" icon="fa-plus" clickFun="TSite.openAddTSite()"/>
+                    <#button name="编辑" icon="fa-edit" clickFun="TSite.openTSiteDetail()" space="true"/>
+                    <#button name="删除" icon="fa-remove" clickFun="TSite.del()" space="true"/>
+                </div>
+                <#table id="TSiteTable"/>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/tCoachType/tCoachType.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
index 6834772..75f870d 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
@@ -259,7 +259,6 @@
                                 <img width="100%" :src="imageUrl1" alt="">
                         </div>
                     </div>
-                    
                 </div>
             </div>
 
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html
index 3b46690..247e10d 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html
@@ -26,6 +26,7 @@
                                         <div class="row btn-group-m-t">
                                             <div class="col-sm-10 col-sm-offset-5">
                                                 <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="add();" />
+                                                <#button btnCss="info" name="关闭" id="close" icon="fa-check"  clickFun="closeD();" />
                                             </div>
                                         </div>
                                         <label for="sort">*排   序:</label>
@@ -42,11 +43,18 @@
     </div>
 </div>
 <script type="text/javascript">
+    /**
+     * 关闭此对话框
+     */
+    function closeD(){
+        console.log("关闭");
+        parent.layer.close(window.parent.TQuestion.layerIndex);
+    }
     const data1 = {
         content:"",
         sort:null,
         answer:""
-    }
+    };
     var editor_1 = null;
     $(function () {
         //初始化编辑器
@@ -72,8 +80,7 @@
         data1.content = value1;
         data1.sort =  value2;
         data1.answer =editor_1.getContent();
-        console.log(data1);
-            submitData(data1);
+        submitData(data1);
     }
     function submitData(data) {
         $.ajax({
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html
index 75205ea..2686537 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html
@@ -28,6 +28,7 @@
                                         <div class="row btn-group-m-t">
                                             <div class="col-sm-10 col-sm-offset-5">
                                                 <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="edit();" />
+                                                <#button btnCss="info" name="关闭" id="close" icon="fa-check" clickFun="closeD();" />
                                             </div>
                                         </div>
                                         <label for="sort">*排   序:</label>
@@ -45,7 +46,13 @@
 </div>
 <script type="text/javascript">
 
-
+    /**
+     * 关闭此对话框
+     */
+    function closeD(){
+        console.log("关闭");
+        parent.layer.close(window.parent.TQuestion.layerIndex);
+    }
     const data1 = {
         id:null,
         content:"",
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html
index 66986b0..86d58b0 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html
@@ -26,6 +26,9 @@
                                             <textarea id="editor_1"  type="text/plain" style="width:1200px;height:400px;">${info.answer}</textarea>
                                         </div>
                                         <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="关闭" id="close" icon="fa-check" clickFun="closeD();" />
+                                            </div>
                                         </div>
                                         <label for="sort">*排   序:</label>
                                         <input type="text" id="sort" value="${info.sort}" placeholder="请输入排序"><span>&nbsp;&nbsp;&nbsp;数字越大,权重越大</span>
@@ -42,7 +45,13 @@
 </div>
 <script type="text/javascript">
 
-
+    /**
+     * 关闭此对话框
+     */
+    function closeD(){
+        console.log("关闭");
+        parent.layer.close(window.parent.TQuestion.layerIndex);
+    }
     const data1 = {
         id:null,
         content:"",
@@ -87,6 +96,7 @@
             contentType: "application/json", // 设置请求头的 Content-Type
             data: JSON.stringify(data), // 将数据转换为 JSON 字符串
             success: function(response) {
+
                 Feng.success("修改成功!");
             },
             error: function(xhr, status, error) {
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
index edaad1d..9eb2b1f 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
@@ -63,7 +63,6 @@
                     <#button name="重置密码" icon="fa-remove" clickFun="TCompetition.reload()" space="true"/>
                     <#button name="免费福利" icon="fa-remove" clickFun="TCompetition.gift()" space="true"/>
                     <#button name="首页设置" icon="fa-remove" clickFun="TCompetition.indexSet()" space="true"/>
-
                 </div>
                 <#table id="TCompetitionTable"/>
             </div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html
index 20d378a..103833c 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html
@@ -66,13 +66,10 @@
             <#avatar id="img" name="门店封面(推荐像素722*360px)" avatarImg="${item.coverDrawing}"/>
             <#input id="imgOne" name="实景照片" type="text" value="${item.realPicture}"/>
 
-
         </div>
         <div class="row btn-group-m-t">
             <div class="col-sm-10 col-sm-offset-5">
-                @if(type==1){
                 <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
-                @}
                 <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
             </div>
         </div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_add.html
deleted file mode 100644
index 5677e41..0000000
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_add.html
+++ /dev/null
@@ -1,181 +0,0 @@
-@layout("/common/_container.html"){
-<style>
-    .avatar-uploader .el-upload {
-        border: 1px dashed #d9d9d9;
-        border-radius: 6px;
-        cursor: pointer;
-        position: relative;
-        height: 100px;
-        width: 100px;
-        overflow: hidden;
-    }
-
-    .avatar-uploader .el-upload:hover {
-        border-color: #409EFF;
-    }
-    .avatar-uploader-icon {
-        font-size: 28px;
-        color: #8c939d;
-        width: 100px;
-        height: 100px;
-        line-height: 100px;
-        margin-top: 32px;
-        text-align: center;
-    }
-    .avatar {
-        width: 100px;
-        height: 100px;
-        display: block;
-    }
-
-    .col-sm-12 {
-        margin-top: 20px;
-    }
-
-    .col-sm-12 select {
-        height: 33px;
-    }
-</style>
-<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
-<div class="ibox float-e-margins">
-    <div class="ibox-content">
-
-
-        <div class="form-horizontal" id="carInfoForm">
-            <input hidden id="role" value="${role}">
-            @if(role=='1'){
-            <div class="form-group" id="provinceCode">
-                <label class="col-sm-3 control-label">所在省:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
-                        <option value="">选择省</option>
-                        @for(obj in list){
-                        <option value="${obj.code}">${obj.name}</option>
-                        @}
-                    </select>
-                </div>
-            </div>
-            <div class="form-group" id="cityCode">
-                <label class="col-sm-3 control-label">所在市:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="cCode" name="cCode" onchange="TCarInfoDlg.oneChangeNext(this)">
-                        <option value="">选择市</option>
-                    </select>
-                </div>
-            </div>
-            <div class="form-group" >
-                <label class="col-sm-3 control-label">所属账号:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="account" name="account">
-                        <option value="">选择账号</option>
-                    </select>
-                </div>
-            </div>
-            @}
-        <#input id="name" name="门店名称" type="text"/>
-        <#input id="phone" name="联系电话" type="text"/>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">门店地址:</label>
-                <div class="col-sm-9">
-                    <input class="form-control" id="address" name="address" type="text" onchange="TCarInfoDlg.searchByStationName(this,1)">
-
-                </div>
-            </div>
-            <div class="col-sm-10" style="margin-left: 397px;width: 70%;" >
-                <!-- 创建地图容器-->
-                <div id="container" style="height: 500px;" ></div>
-            </div>
-        <#input id="time" name="营业时间" type="text"/>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">门店介绍:</label>
-                <div class="col-sm-9">
-                    <textarea id="introduce" style="width: 617px; height: 180px;"></textarea>
-                </div>
-            </div>
-        <#input id="userName" name="店长姓名" type="text"/>
-        <#input id="userPhone" name="店长手机号" type="text"/>
-        <#avatar id="img" name="门店封面(推荐像素722*360px)" />
-            <div class="row" id="app1">
-                <div class="col-sm-6" style="width: 100%">
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label" style="width: 15%;margin-left: 5%">*实景图片(请上传不超过五张图片): </label>
-                        <div class="col-sm-2" style="width: 100%;margin-left: 11%;margin-top: 1%">
-                            <el-upload
-                                    :limit="5"
-                                    class="avatar-uploader"
-                                    action="/tCouponManage/uploadPic"
-                                    list-type="picture-card"
-                                    accept="."
-                                    :on-success="handleAvatarSuccess"
-                                    :on-remove="handleRemove">
-                                <i class="el-icon-plus"></i>
-                            </el-upload>
-                            <el-dialog :visible.sync="dialogVisible">
-                                <img width="100%" :src="imageUrl1" alt="">
-                        </div>
-                    </div>
-
-                </div>
-            </div>
-
-
-        </div>
-</div>
-
-<div class="row btn-group-m-t">
-    <div class="col-sm-10 col-sm-offset-5">
-        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.addSubmit()"/>
-        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
-    </div>
-</div>
-
-        </div>
-
-    </div>
-</div>
-<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
-<script src="${ctxPath}/js/vue/vue.js"></script>
-<script src="${ctxPath}/js/elementui/index.js"></script>
-<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
-<script>
-    laydate.render({
-        elem: '#time',
-        range:true
-    });
-
-    var vue2 = new Vue({
-        el: '#app1',
-        props: {
-            // 数量限制
-            limit: {
-                type: Number,
-                default: 2
-            },
-        },
-        data: {
-            autoUpload: true,//自动上传
-            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
-            dialogVisible: false
-        },
-        methods: {
-            handleAvatarSuccess(res, file) {
-                couponInfoDlg.goodsPicArray.push(file);
-            },
-            beforeAvatarUpload(file) {
-                const isLt2M = file.size / 1024 / 1024 < 10;
-                if (!isLt2M) {
-                    this.$message.error('上传图片大小不能超过 10MB!');
-                }
-                return isLt2M;
-            },
-            handleRemove(file, fileList) {
-                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
-                    return item.uid != file.uid;
-                });
-            },
-        },
-        created() {
-        },
-    });
-</script>
-@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_edit.html
deleted file mode 100644
index 20d378a..0000000
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_edit.html
+++ /dev/null
@@ -1,92 +0,0 @@
-@layout("/common/_container.html"){
-<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
-<div class="ibox float-e-margins">
-    <div class="ibox-content">
-
-        <div class="form-horizontal" id="carInfoForm">
-            <input hidden id="id" value="${item.id}">
-            <input hidden id="role" value="${role}">
-            @if(role=='1'){
-            <div class="form-group" id="provinceCode">
-                <label class="col-sm-3 control-label">所在省:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
-                        <option value="">选择省</option>
-                        @for(obj in list){
-                        <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
-                        @}
-                    </select>
-                </div>
-            </div>
-            <div class="form-group" id="cityCode">
-                <label class="col-sm-3 control-label">所在市:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="cCode" name="cCode"  onchange="TCarInfoDlg.oneChangeNext(this)">
-                        <option value="">选择市</option>
-                        @for(obj in list1){
-                        <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
-                        @}
-                    </select>
-                </div>
-            </div>
-            <div class="form-group" >
-                <label class="col-sm-3 control-label">所属账号:</label>
-                <div class="col-sm-9">
-                    <select class="form-control" id="account" name="account">
-                        <option value="">选择账号</option>
-                        @for(obj in list2){
-                        <option value="${obj.id}" ${obj.id == item.cityManagerId ? 'selected=selected' : ''}>${obj.name}-${obj.phone}</option>
-                        @}
-                    </select>
-                </div>
-            </div>
-            @}
-            <#input id="name" name="门店名称" type="text" value="${item.name}"/>
-            <#input id="phone" name="联系电话" type="text" value="${item.phone}"/>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">门店地址:</label>
-                <div class="col-sm-9">
-                    <input class="form-control" id="address" name="address" type="text"  value="${item.address}" onchange="TCarInfoDlg.searchByStationName(this,1)">
-
-                </div>
-            </div>
-            <div class="col-sm-10" style="margin-left: 397px;width: 70%;" >
-                <!-- 创建地图容器-->
-                <div id="container" style="height: 500px;" ></div>
-            </div>
-            <#input id="time" name="营业时间" type="text" value="${time}"/>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">门店介绍:</label>
-                <div class="col-sm-9">
-                    <textarea id="introduce" style="width: 617px; height: 180px;">${item.introduce}</textarea>
-                </div>
-            </div>
-            <#input id="userName" name="管理员姓名" type="text" value="${city.name}"/>
-            <#input id="userPhone" name="管理员手机号" type="text" value="${city.account}"/>
-            <#avatar id="img" name="门店封面(推荐像素722*360px)" avatarImg="${item.coverDrawing}"/>
-            <#input id="imgOne" name="实景照片" type="text" value="${item.realPicture}"/>
-
-
-        </div>
-        <div class="row btn-group-m-t">
-            <div class="col-sm-10 col-sm-offset-5">
-                @if(type==1){
-                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
-                @}
-                <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
-            </div>
-        </div>
-
-    </div>
-</div>
-<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
-<script>
-    laydate.render({
-        elem: '#time',
-        range:true
-    });
-</script>
-<script type="application/javascript">
-
-</script>
-@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_img.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_img.html
deleted file mode 100644
index 1cff518..0000000
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_img.html
+++ /dev/null
@@ -1,44 +0,0 @@
-@layout("/common/_container.html"){
-<div class="ibox float-e-margins">
-    <div class="ibox-content">
-
-        <div class="form-horizontal" id="carInfoForm">
-            <input hidden id="id" value="${id}">
-            @if(welfarePicture==null){
-            <#avatar id="welfarePicture" name="福利图片"/>
-            @}
-            @if(welfarePicture!=null){
-            <#avatar id="welfarePicture" name="福利图片" avatarImg="${welfarePicture}"/>
-            @}
-            @if(welfarePicture==12321){
-            <div class="form-group">
-                <div class="col-sm-4">
-                    <div id="welfarePicturePreId">
-                        <div><img width="700px" height="800px" id="img" src="${welfarePicture}" ></div>
-                    </div>
-                </div>
-
-                <input type="hidden" id="welfarePicture">
-            </div>
-            <div class="col-sm-2" style="margin-left: 280px">
-                <div class="head-scu-btn upload-btn webuploader-container" id="welfarePictureBtnId"><div class="webuploader-pick">
-                    <i class="fa fa-upload"></i>&nbsp;Upload
-                </div><div id="rt_rt_1h6lka0hk9mucj87vf1t21qk31" style="position: absolute; inset: 0px auto auto 0px; width: 82px; height: 28px; overflow: hidden;"><input type="file" name="file" class="webuploader-element-invisible" accept="image/gif,image/jpg,image/jpeg,image/bmp,image/png"><label style="opacity: 0; width: 100%; height: 100%; display: block; cursor: pointer; background: rgb(255, 255, 255);"></label></div></div>
-            </div>
-            @}
-
-        </div>
-        <div class="row btn-group-m-t">
-            <div class="col-sm-10 col-sm-offset-5">
-                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.saveImg()"/>
-            </div>
-        </div>
-
-    </div>
-</div>
-<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
-<script>
-</script>
-<script type="application/javascript">
-</script>
-@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_imgAll.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_imgAll.html
deleted file mode 100644
index 9a40637..0000000
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_imgAll.html
+++ /dev/null
@@ -1,253 +0,0 @@
-@layout("/common/_container.html"){
-<div class="ibox float-e-margins">
-    <div class="ibox-content">
-
-        <div class="form-horizontal" id="carInfoForm">
-            <input hidden id="id" value="${id}">
-            <input hidden id="s1" value="${c1.isOpen}">
-            <input hidden id="s2" value="${c2.isOpen}">
-            <input hidden id="s3" value="${c3.isOpen}">
-            <input hidden id="s4" value="${c4.isOpen}">
-            <input hidden id="s5" value="${c5.isOpen}">
-            <input hidden id="s6" value="${c6.isOpen}">
-            <input hidden id="s7" value="${c7.isOpen}">
-            <input hidden id="s8" value="${c8.isOpen}">
-            <div class="row">
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                              报名玩湃课程:<input type="radio" name="r1" value="1">开启 <input type="radio" name="r1" value="0">关闭
-                        </label>
-                    </div>
-                <div class="form-group">
-                    <label class="col-sm-3 control-label">排序:</label>
-                    <div class="col-sm-9">
-                        <input class="form-control"  style="width: 200px;"  type="text" id="px1" value="${c1.sort}">
-                    </div>
-                </div>
-                @if(c1==null){
-                <#avatar id="c1" name="背景图" />
-                @}
-                @if(c1!=null){
-                <#avatar id="c1" name="背景图" avatarImg="${c1.backgroundImage}"/>
-                @}
-                </div>
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            预约场地:<input type="radio" name="r2" value="1">开启 <input type="radio" name="r2" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px2" value="${c2.sort}">
-                        </div>
-                    </div>
-                    @if(c2==null){
-                    <#avatar id="c2" name="背景图" />
-                    @}
-                    @if(c2!=null){
-                    <#avatar id="c2" name="背景图" avatarImg="${c2.backgroundImage}"/>
-                    @}
-                </div>
-            </div>
-
-
-
-            <div class="row">
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            报名赛事及活动:<input type="radio" name="r3" value="1">开启 <input type="radio" name="r3" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px3" value="${c3.sort}">
-                        </div>
-                    </div>
-                    @if(c3==null){
-                    <#avatar id="c3" name="背景图" />
-                    @}
-                    @if(c3!=null){
-                    <#avatar id="c3" name="背景图" avatarImg="${c3.backgroundImage}"/>
-                    @}
-                </div>
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            免费福利:<input type="radio" name="r4" value="1">开启 <input type="radio" name="r4" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px4" value="${c4.sort}">
-                        </div>
-                    </div>
-                    @if(c4==null){
-                    <#avatar id="c4" name="背景图" />
-                    @}
-                    @if(c4!=null){
-                    <#avatar id="c4" name="背景图" avatarImg="${c4.backgroundImage}"/>
-                    @}
-                </div>
-            </div>
-
-
-
-            <div class="row">
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            线上课得积分:<input type="radio" name="r5" value="1">开启 <input type="radio" name="r5" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px5" value="${c5.sort}">
-                        </div>
-                    </div>
-                    @if(c5==null){
-                    <#avatar id="c5" name="背景图" />
-                    @}
-                    @if(c5!=null){
-                    <#avatar id="c5" name="背景图" avatarImg="${c5.backgroundImage}"/>
-                    @}
-                </div>
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            购买优惠门票:<input type="radio" name="r6" value="1">开启 <input type="radio" name="r6" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px6" value="${c6.sort}">
-                        </div>
-                    </div>
-                    @if(c6==null){
-                    <#avatar id="c6" name="背景图" />
-                    @}
-                    @if(c6!=null){
-                    <#avatar id="c6" name="背景图" avatarImg="${c6.backgroundImage}"/>
-                    @}
-                </div>
-            </div>
-
-
-            <div class="row">
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            看视频得奖励:<input type="radio" name="r7" value="1">开启 <input type="radio" name="r7" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px7" value="${c7.sort}">
-                        </div>
-                    </div>
-                    @if(c7==null){
-                    <#avatar id="c7" name="背景图" />
-                    @}
-                    @if(c7!=null){
-                    <#avatar id="c7" name="背景图" avatarImg="${c7.backgroundImage}"/>
-                    @}
-                </div>
-                <div class="col-lg-6" style="">
-                    <div class="form-group" style="margin-left: 96px">
-                        <label class="col-sm-4 control-label" >
-                            智慧球场:<input type="radio" name="r8" value="1">开启 <input type="radio" name="r8" value="0">关闭
-                        </label>
-                    </div>
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">排序:</label>
-                        <div class="col-sm-9">
-                            <input class="form-control"  style="width: 200px;"  type="text" id="px8" value="${c8.sort}">
-                        </div>
-                    </div>
-                    @if(c8==null){
-                    <#avatar id="c8" name="背景图" />
-                    @}
-                    @if(c8!=null){
-                    <#avatar id="c8" name="背景图" avatarImg="${c8.backgroundImage}"/>
-                    @}
-                </div>
-            </div>
-
-
-
-        </div>
-        <div class="row btn-group-m-t">
-            <div class="col-sm-10 col-sm-offset-5">
-                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.saveAllImg()"/>
-            </div>
-        </div>
-
-    </div>
-</div>
-<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
-
-<script>
-</script>
-<script type="application/javascript">
-    window.onload = function(){
-        var OBJradio=document.getElementsByName("r1")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s1").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r2")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s2").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r3")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s3").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r4")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s4").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r5")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s5").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r6")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s6").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r7")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s7").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-        var OBJradio=document.getElementsByName("r8")
-        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
-            if($("#s8").val()==OBJradio[i].value){//判断是否与radio的值相同
-                OBJradio[i].checked=true//修改选中状态
-            }
-        }
-
-
-    }
-</script>
-@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html
index a0d98f0..6851fc7 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html
@@ -2,7 +2,7 @@
 <div class="row">
     <div class="col-sm-12">
         <div class="ibox float-e-margins">
-            <input hidden id="role" value="${role}">
+
             <div class="ibox-title">
                 <h5>场地管理</h5>
             </div>
@@ -10,7 +10,7 @@
                 <div class="row row-lg">
                     <div class="col-sm-12">
                         <div class="row">
-                            @if(role=='1'){
+                            @if(objectType==1){
                             <div class="col-sm-3">
                                 <div class="input-group">
                                     <div class="input-group-btn open">
@@ -18,16 +18,16 @@
                                             所在省
                                         </button>
                                     </div>
-                                    <select class="form-control" id="pCode" onchange="TSite.oneChange(this)">
+                                    <select class="form-control" id="pCode" onchange="TSite.oneChange(1)">
                                         <option value="">全部</option>
                                         @for(obj in list){
-                                        <option value="${obj.code}">${obj.name}</option>
+                                        <option value="${obj}">${obj}</option>
                                         @}
                                     </select>
                                 </div>
                             </div>
                             @}
-                            @if(role=='1'){
+                            @if(objectType==1){
                             <div class="col-sm-3">
                                 <div class="input-group">
                                 <div class="input-group-btn open">
@@ -36,39 +36,54 @@
                                     </button>
                                 </div>
                                 <select class="form-control" id="cCode">
+                                    <option value="">请先选择省</option>
                                 </select>
                                  </div>
                             </div>
                             @}
                             <div class="col-sm-3">
-                                <#NameCon id="name" name="店长姓名" />
+                                <#NameCon id="storeName" name="门店名称" />
+                            </div>
+
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                    <div class="input-group-btn open">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                            场地类型
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="sCode" >
+                                        <option value="">全部</option>
+                                        @for(obj in siteType){
+                                        <option value="${obj.id}">${obj.name}</option>
+                                        @}
+                                    </select>
+                                </div>
                             </div>
                             <div class="col-sm-3">
-                                <#NameCon id="phone" name="店长手机号" />
-                            </div>
-                            <div class="col-sm-3">
-                                <#NameCon id="shopName" name="门店名称" />
+                                <#NameCon id="name" name="场地名称" />
                             </div>
                     <div class="col-sm-3">
-                        <#button name="搜索" icon="fa-search" clickFun="TCompetition.search()"/>
-                        <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
+                        <#button name="搜索" icon="fa-search" clickFun="TSite.search()"/>
+                        <#button name="重置" icon="fa-trash" clickFun="TSite.resetSearch()" space="true"/>
                     </div>
                 </div>
                 <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
-                    <#button name="添加" icon="fa-plus" clickFun="TCompetition.openAddTCompetition()"/>
-                    <#button name="编辑" icon="fa-edit" clickFun="TCompetition.openTCompetitionDetail()" space="true"/>
-                    <#button name="冻结" icon="fa-remove" clickFun="TCompetition.freeze()" space="true"/>
-                    <#button name="解冻" icon="fa-remove" clickFun="TCompetition.unfreeze()" space="true"/>
-                    <#button name="查看详情" icon="fa-remove" clickFun="TCompetition.info()" space="true"/>
-                    <#button name="重置密码" icon="fa-remove" clickFun="TCompetition.reload()" space="true"/>
-                    <#button name="免费福利" icon="fa-remove" clickFun="TCompetition.gift()" space="true"/>
-                    <#button name="首页设置" icon="fa-remove" clickFun="TCompetition.indexSet()" space="true"/>
-
+                    <#button name="添加" icon="fa-plus" clickFun="TSite.openAddTSite()"/>
+                    <#button name="编辑" icon="fa-edit" clickFun="TSite.openEditTSite()" space="true"/>
+                    <#button name="上架" icon="fa-check" clickFun="TSite.onShelf()" space="true"/>
+                    <#button name="下架" icon="fa-remove" clickFun="TSite.offShelf()" space="true"/>
+                    <#button name="查看详情" icon="fa-search" clickFun="TSite.openInfo()" space="true"/>
+                    <#button name="锁定场地" icon="fa-remove" clickFun="TSite.lock()" space="true"/>
                 </div>
-                <#table id="TCompetitionTable"/>
+                <#table id="TSiteTable"/>
             </div>
         </div>
     </div>
+            <input hidden id="role" value="${role}">
+            <input hidden id="objectType" value="${objectType}">
+            <input hidden id="objectId" value="${objectId}">
+            <input hidden id="type" value="${type}">
 </div>
 </div>
 </div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html
new file mode 100644
index 0000000..4499976
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html
@@ -0,0 +1,247 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+    #app1{
+        margin-left: 255px;
+    }
+
+
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <input hidden id="objectType" value="${objectType}">
+    <input hidden id="objectId" value="${objectId}">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="role" value="${role}">
+            @if(objectType==1){
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange(2)">
+                        <option style="width: 300px" value="">选择省</option>
+                        @for(obj in province){
+                        <option style="width: 300px" value="${obj}">${obj}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TSite.oneChangeNext(this)">
+                        <option value="">请先选择省</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            @if(objectType==1){
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属账号:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="account" name="account">
+                        <option value="">请先选择省/市</option>
+                    </select>
+                </div>
+            </div>
+            @}
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属门店:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="store" name="store"  >
+                        <option disabled selected value="">请选择门店</option>
+                        @if(objectType!=1){
+                            @for(obj in stores){
+                            <option style="width: 300px" value="${obj.id}">${obj.name}</option>
+                            @}
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*场地分类:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="siteTypeId" name = "typeId">
+                        <option value="">选择类型</option>
+                        @for(obj in siteType){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+        <#input style="width: 300px" id="name" name="*场地名称" type="text"/>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*可预约时间段:</label>
+                <!-- <input style="width: 300px" class="form-control"  type="time">-->
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 136px;" value="开始时间" id="start-time" class="form-control" type="time">
+                    <span style="margin-top: 7px">&nbsp;&nbsp;至&nbsp;&nbsp;</span>
+                    <input style="width: 136px;" value="结束时间" id="end-time" class="form-control" type="time">
+                </div>
+            </div>
+
+            <div class="form-group"  >
+                <label class="col-sm-3 control-label">*现金价格:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="cashPrice" name="playPaiCoin" placeholder="请输入价格" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">元/半小时</span>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*玩湃币价格:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="playPaiCoin" name="playPaiCoin" placeholder="请输入价格" type="text">
+                    <span style="margin-left: 5px;margin-top: 5px">币/半小时</span>
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*场地责任险有效期:</label>
+                <div class="col-sm-9">
+                    <input style="width: 300px" class="form-control" id="insuranceEndTime" name="insuranceEndTime" type="date">
+                </div>
+
+                <#avatar id="img" name="" avatarImg=""/>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label head-scu-label">*消防及应急管理方案:</label>
+                        <div class="col-sm-2" style="padding-top: 30px;">
+                            <input type="file" id="upFile" name="upFile" style="display: none">
+                            <input class="form-control" id="courseVideo" readonly/>
+                        </div>
+                        <div class="col-sm-2" style="padding-top: 30px;">
+                            <button class="btn btn-outline btn-success" type="file" onclick="UploadFileFn()"><i class="fa fa-upload"></i>上传文件</button>
+                        </div>
+                    </div>
+                @if(objectType==1){
+                <div class="row" id="app1">
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label head-scu-label">*实景图片(请上传不超过五张图片): </label>
+                            <div class="col-sm-2" style="width: 100%;margin-left: 11%;margin-top: 1%">
+                                <el-upload
+                                        :limit="5"
+                                        class="avatar-uploader"
+                                        action="/tCouponManage/uploadPic"
+                                        list-type="picture-card"
+                                        accept="."
+                                        :on-success="handleAvatarSuccess"
+                                        :on-remove="handleRemove">
+                                    <i class="el-icon-plus"></i>
+                                </el-upload>
+                                <el-dialog :visible.sync="dialogVisible">
+                                    <img width="100%" :src="imageUrl1" alt="">
+                                </el-dialog>
+                        </div>
+                    </div>
+                </div>
+                @}
+                @if(objectType==1){
+                <#input style="width: 300px" id="name" name="*添加闸机:" placeholder="请输入闸机ID" type="text"/>
+                @}
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5" >
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/>
+    </div>
+</div>
+
+        </div>
+        </div>
+
+    </div>
+
+</div>
+
+<script src="${ctxPath}/modular/system/tSite/tSite.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TSite.goodsPicArray.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TSite.goodsPicArray = TSite.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+    var selectElement = document.getElementById('store');
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+    startTime.disabled = true;
+    endTime.disabled = true;
+    selectElement.addEventListener('change',function () {
+        if (selectElement.value !== ''){
+            startTime.disabled = false;
+            endTime.disabled = false;
+        }else{
+            startTime.disabled = true;
+            endTime.disabled = true;
+        }
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html
new file mode 100644
index 0000000..a608a3d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html
@@ -0,0 +1,207 @@
+@layout("/common/_container.html"){
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+
+            @if(objectType == 1){
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">*所在省:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSiteInfo.oneChange(this)">
+<!--                        <option style="width: 300px" value="${list.province}">${list.province}</option>-->
+                        @for(obj in province){
+                        <option value="${obj}" ${obj == list.province ? 'selected=selected' : ''}>${obj}</option>
+<!--                        <option style="width: 300px" value="${obj}">${obj}</option>-->
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">*所在市:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="cCode" name="cCode" onchange="TSiteInfo.oneChangeNext(this)">
+                        @for(obj in city1){
+                        <option value="${obj.city}" ${obj.city == list.city ? 'selected=selected' : ''}>${obj.city}</option>
+<!--                        <option style="width: 300px" value="${obj.city}">${obj.city}</option>-->
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属账号:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="account" name="account">
+                        @for(obj in accounts){
+                        <option style="width: 300px" value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            @}
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*所属门店:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="store" name="store" onchange="TSiteInfo.getTime(this)" >
+                            @for(obj in stores){
+                        <option value="${obj.id}" ${obj.id == list.storeId ? 'selected=selected' : ''}>${obj.name}</option>
+<!--                        <option style="width: 300px" value="${obj.id}">${obj.name}</option>-->
+                            @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="siteType">
+                <label class="col-sm-3 control-label">*场地类型:</label>
+                <div class="col-sm-9">
+                    <select style="width: 300px" class="form-control" id="siteTypeId" name = "typeId">
+                        @for(obj in siteType){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group"  >
+                <label class="col-sm-3 control-label">*场地名称:</label>
+                <div class="col-sm-9" >
+                    <input style="width: 300px" class="form-control" id="name" name="name" type="text" value="${list.name}">
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*可预约时间段:</label>
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 150px;" value="${list.appointmentStartTime}" id="start-time" class="form-control" type="time" >
+                    <span style="margin-top: 7px">&nbsp;&nbsp;至&nbsp;&nbsp;</span>
+                    <input style="width: 150px;" value="${list.appointmentEndTime}" id="end-time" class="form-control" type="time">
+                </div>
+            </div>
+
+            <div class="form-group"  >
+                <label class="col-sm-3 control-label">*现金价格:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="cashPrice" name="playPaiCoin" type="text" value="${list.cashPrice}">
+                    <span style="margin-left: 5px;margin-top: 5px">元/半小时</span>
+                </div>
+            </div>
+
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">*玩湃币价格:</label>
+                <div class="col-sm-9" style="display: flex;">
+                    <input style="width: 300px" class="form-control" id="playPaiCoin" name="playPaiCoin" type="text" value="${list.playPaiCoin}">
+                    <span style="margin-left: 5px;margin-top: 5px">币/半小时</span>
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label">*场地责任险有效期:</label>
+                <div class="col-sm-9">
+                    <input value="${time}" style="width: 300px" class="form-control" id="insuranceEndTime" name="insuranceEndTime" type="date">
+                </div>
+            </div>
+            <#avatar id="img" name="" value ="${list.insuranceImg}" avatarImg="${list.insuranceImg}"/>
+
+            <div class="form-group">
+                <label class="col-sm-3 control-label head-scu-label">*消防及应急管理方案:</label>
+                <div class="col-sm-2" style="padding-top: 30px;">
+                    <input type="file" id="upFile" name="upFile" style="display: none">
+                    <input class="form-control" id="courseVideo" value="${list.managementPlan}" readonly/>
+                </div>
+                <div class="col-sm-2" style="padding-top: 30px;">
+                    <button class="btn btn-outline btn-success" type="file" onclick="UploadFileFn()"><i class="fa fa-upload"></i>上传文件</button>
+                </div>
+            </div>
+            @if(objectType ==1){
+            <div class="row" id="app1">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*实景图片(请上传不超过五张图片): </label>
+                    <div class="col-sm-2" style="width: 100%;margin-left: 11%;margin-top: 1%">
+                        <el-upload
+                                :limit="5"
+                                class="avatar-uploader"
+                                action="/tCouponManage/uploadPic"
+                                list-type="picture-card"
+                                accept="."
+                                :on-success="handleAvatarSuccess"
+                                :on-remove="handleRemove">
+                            <i class="el-icon-plus"></i>
+                        </el-upload>
+                        <el-dialog :visible.sync="dialogVisible">
+                            <img width="100%" :src="imageUrl1" alt="">
+                        </el-dialog>
+                    </div>
+                </div>
+            </div>
+            @}
+        </div>
+        @if(objectType==1){
+        <#input style="width: 300px" id="name" name="*添加闸机:" placeholder="请输入闸机ID" type="text"/>
+        @}
+        <div class="row btn-group-m-t">
+            <div class="col-sm-10 col-sm-offset-5" >
+                @if(type==1){
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSiteInfo.addSubmit()"/>
+                @}
+                <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TSiteInfo.close()"/>
+            </div>
+        </div>
+        <input hidden id="role" value="${role}">
+        <input type="hidden" id="id" value="${list.id}">
+    </div>
+<!--    <img  id="img" value="${list.insuranceImg}"/>-->
+<!--    <img  id = "plan" value="${list.managementPlan}"/>-->
+</div>
+
+<script src="${ctxPath}/modular/system/tSite/tSite_info.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TCarInfoDlg.goodsPicArray.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TCarInfoDlg.goodsPicArray = TCarInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+    var selectElement = document.getElementById('store');
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+
+    selectElement.addEventListener('change',function () {
+        if (selectElement.value !== ''){
+            startTime.disabled = false;
+            endTime.disabled = false;
+        }else{
+            startTime.disabled = true;
+            endTime.disabled = true;
+        }
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html
new file mode 100644
index 0000000..0abd02f
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html
@@ -0,0 +1,62 @@
+@layout("/common/_container.html"){
+<style>
+
+    .ibox-content {
+        text-align: center;
+    }
+
+</style>
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm"><h2 style="margin-bottom: 20px"> 锁定场地 </h2>
+            <div class="form-group" style="margin-left: 225px"  >
+                <label  class="col-sm-3 control-label">锁定时间:</label>
+                <div class="col-sm-9"  style="display: flex">
+                    <input style="width: 200px;" value="开始时间" id="start-time" class="form-control" type="datetime-local">
+                    <span style="margin-top: 7px">&nbsp;&nbsp;至&nbsp;&nbsp;</span>
+                    <input style="width: 200px;" value="结束时间" id="end-time" class="form-control" type="datetime-local">
+                    <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                    <#button btnCss="info" name="添加" id="${id}" icon="fa-check" clickFun="TSiteLock.add(${id})"/>
+                </div>
+            </div>
+            <div class="form-group" style="margin-left: 150px"  >
+                <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+                    <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="lockTable">
+                        <thead>
+                        <tr>
+                            <td hidden>主键id</td>
+                            <td>开始时间</td>
+                            <td>结束时间</td>
+                            <td>操作</td>
+                        </tr>
+                        </thead>
+                        <tbody id="coun">
+                        @for(obj in list){
+                        <tr class="timeClass">
+                            <td><span>${obj.ssTime}</span></td>
+                            <td><span>${obj.eeTime}</span></td>
+                            <td><button id = "${obj.id}" onclick="TSiteLock.delete(this)">删除</button></td>
+                        </tr>
+                        @}
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="row btn-group-m-t" style="margin-left: 145px">
+        <div class="col-sm-10 col-sm-offset-5" >
+            <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSiteLock.close()"/>
+        </div>
+    </div>
+</div>
+
+<script src="${ctxPath}/modular/system/tSite/tSiteLock.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js b/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js
index d3b88c0..e352129 100644
--- a/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js
+++ b/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js
@@ -62,5 +62,5 @@
 	};
 	
 	window.$ax = $ax;
-	
+
 } ());
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js b/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js
index ad01d19..c8fd52c 100644
--- a/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js
+++ b/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js
@@ -3,6 +3,7 @@
  */
 // 开始上传文件
 function UploadFileFn() {
+    console.log("上传文件")
     $("#progressBarFile").html("0%").css("width", "0%");
     var upFile = $("#upFile").get(0).files[0]; //input file标签
 
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js b/cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js
new file mode 100644
index 0000000..ec2ea1b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js
@@ -0,0 +1,340 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '分类名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '所在位置', field: 'position', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"先上课得积分",2:"看视频得奖励"}[data]
+            }
+        },
+        {title: '视频数', field: 'count', visible: true, align: 'center', valign: 'middle'},
+        {title: '排序', field: 'sort', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"上架中",2:"下架中",3:"已失效"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/benefits/add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/update/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    const data1 = {
+        ids:[],
+        state:null
+    };
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        data1.ids.push(id);
+    });
+    data1.state = 1;
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/changeState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/info/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/getBenefitsVideos/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+
+TQuestion.addSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name       = $("#name").val()
+    data.position           = $("#position").val()
+    data.sort           = $("#sort").val()
+
+
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['position'] = $("#position").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+    $("#name").val('');
+    $("#position").val('');
+    TQuestion.search();
+};
+
+$(function () {
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/benefits/list", defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js
new file mode 100644
index 0000000..77df638
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js
@@ -0,0 +1,361 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: 'benefitsVideosId', field: 'benefitsVideosId', visible: false, align: 'center', valign: 'middle'},
+        {title: '视频类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"课后练习",2:"运动教学视频",3:"器材教学视频"}[data]
+            }
+        },
+        {title: '视频封面', field: 'coverDrawing', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                value = typeof value == "undefined" || value == '' ? '/static/img/NoPIC.png' : value;
+                return '<img src="' + value + '" style="height: 100px;"/>'
+            }
+        },
+        {title: '视频名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '视频简介', field: 'introduce', visible: true, align: 'center', valign: 'middle'},
+        {title: '可获积分', field: 'integral', visible: true, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"上架中",2:"下架中",3:"已失效"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+
+
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var val = $("#id").val();
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/benefits/addBenefitsVideos/'+val
+    });
+    this.layerIndex = index;
+};
+
+
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    const data1 = {
+        ids:[],
+        state:null
+    };
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        data1.ids.push(id);
+    });
+    data1.state = 1;
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/changeCourseState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/infoBenefitsVideos/' + TQuestion.seItem.id+'/'+1
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    console.log("看看")
+    console.log();
+    if(selected.length >1 ){
+        Feng.info("只能选择一个进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/infoBenefitsVideos/' + TQuestion.seItem.id+'/'+2+'/'+selected[0]['benefitsVideosId']
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情的详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/infoBenefitsVideos/' + TQuestion.seItem.id+'/'+1+'/'+selected[0]['benefitsVideosId']
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+
+TQuestion.addSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name       = $("#name").val()
+    data.position           = $("#position").val()
+    data.sort           = $("#sort").val()
+
+
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#position").val();
+    queryData['state'] = $("#state").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+    $("#name").val('');
+    $("#state").val('');
+    $("#position").val('');
+    TQuestion.search();
+};
+function UploadFileFn(){
+    $('#upFile').click();
+}
+$(function () {
+
+    var val = $("#id").val();
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/benefits/listBenefitsVideos/"+val, defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js
new file mode 100644
index 0000000..42406f6
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js
@@ -0,0 +1,393 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '视频类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"课后练习",2:"运动教学视频",3:"器材教学视频"}[data]
+            }
+        },
+        {title: '视频封面', field: 'coverDrawing', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                value = typeof value == "undefined" || value == '' ? '/static/img/NoPIC.png' : value;
+                return '<img src="' + value + '" style="height: 100px;"/>'
+            }
+        },
+        {title: '视频名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '视频简介', field: 'introduce', visible: true, align: 'center', valign: 'middle'},
+        {title: '可获积分', field: 'integral', visible: true, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"上架中",2:"下架中",3:"已失效"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+/**
+ * 选择视频 回显视频封面
+ * @param e
+ */
+TQuestion.oneChange = function (e) {
+    var id = $("#name").val();
+    var ajax = new $ax(Feng.ctxPath + "/benefits/getCoverDrawing/"+id, function(data){
+        document.getElementById('img').src = data.coverDrawing;
+        $("#introduce").val(data.introduce);
+    });
+    ajax.set("id",id);
+    ajax.start();
+};
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/benefits/add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/update/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    const data1 = {
+        ids:[],
+        state:null
+    };
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        data1.ids.push(id);
+    });
+    data1.state = 1;
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/changeCourseState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/info/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/getBenefitsVideos/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+
+TQuestion.addSubmit = function(){
+    var data = {
+        benefitsVideoClassificationId:null,
+        courseId:"",
+        integral:""
+    };
+    data.courseId       = $("#name").val()
+    data.benefitsVideoClassificationId         = $("#id").val()
+    data.integral   = $("#integral").val()
+
+    if($("#name").val()==''){
+        Feng.info("请选择视频")
+        return;
+    }
+
+    if($("#integral").val()==''){
+        Feng.info("请输入可获积分")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefitsVideos" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            if (response === 500){
+                Feng.error("所选视频已经存在于当前福利视频分类下!");
+            }else{
+                Feng.success("添加成功");
+            }
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+};
+// 视频详情编辑提交按钮
+TQuestion.updateVideosSubmit = function(){
+    var data = {
+        id:null,
+        integral:null
+    };
+    data.id       = $("#benefitsVideosId").val()
+    data.integral   = $("#integral").val()
+    if($("#integral").val()==''){
+        Feng.info("请输入可获积分")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefitsVideos" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+};
+
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#position").val();
+    queryData['state'] = $("#state").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+    $("#name").val('');
+    $("#state").val('');
+    $("#position").val('');
+    TQuestion.search();
+};
+/**
+ * 关闭此对话框
+ */
+TQuestion.close = function() {
+    parent.layer.close(window.parent.TQuestion.layerIndex);
+}
+
+$(function () {
+    var val = $("#id").val();
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/benefits/listBenefitsVideos/"+val, defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js
new file mode 100644
index 0000000..612e13b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js
@@ -0,0 +1,350 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '视频类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"课后练习",2:"运动教学视频",3:"器材教学视频"}[data]
+            }
+        },
+        {title: '视频封面', field: 'coverDrawing', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                value = typeof value == "undefined" || value == '' ? '/static/img/NoPIC.png' : value;
+                return '<img src="' + value + '" style="height: 100px;"/>'
+            }
+        },
+        {title: '视频名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '视频简介', field: 'introduce', visible: true, align: 'center', valign: 'middle'},
+        {title: '可获积分', field: 'integral', visible: true, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"上架中",2:"下架中",3:"已失效"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/benefits/add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/update/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    const data1 = {
+        ids:[],
+        state:null
+    };
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        data1.ids.push(id);
+    });
+    data1.state = 1;
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/changeCourseState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/info/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/getBenefitsVideos/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+
+TQuestion.addSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name       = $("#name").val()
+    data.position           = $("#position").val()
+    data.sort           = $("#sort").val()
+
+
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#position").val();
+    queryData['state'] = $("#state").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+    $("#name").val('');
+    $("#state").val('');
+    $("#position").val('');
+    TQuestion.search();
+};
+
+$(function () {
+    var val = $("#id").val();
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/benefits/listBenefitsVideos/"+val, defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js b/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js
new file mode 100644
index 0000000..8f7d79b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js
@@ -0,0 +1,426 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所在省市', field: 'provinceAndCity', visible: true, align: 'center', valign: 'middle'},
+        {title: '预约门店', field: 'storeName', visible: true, align: 'center', valign: 'middle'},
+        {title: '家长姓名', field: 'parentName', visible: true, align: 'center', valign: 'middle'},
+        {title: '家长联系方式', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+        {title: '学员姓名', field: 'learnerName', visible: true, align: 'center', valign: 'middle'},
+        {title: '学员年龄', field: 'learnerAge', visible: true, align: 'center', valign: 'middle'},
+        {title: '学员生日', field: 'birthday', visible: true, align: 'center', valign: 'middle'},
+        {title: '预约时间', field: 'appointmentTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"未测试",2:"已测试"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/bodySideAppointment/add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/update/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    var ids=[];
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        ids.push(id);
+    });
+    $.ajax({
+        url: Feng.ctxPath + "/bodySideAppointment/changeState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(ids), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/bodySideAppointment/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/info/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/getBenefitsVideos/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+TQuestion.oneChange = function () {
+    var province = $('#pCode option:selected').text();
+    var citySelect = document.getElementById("cCode");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getCity", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.cityCode+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (province === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+    }
+    ajax.set("province",province);
+    ajax.start();
+};
+
+TQuestion.oneChangeNext = function (e) {
+    var oneId=$(e).val();
+    var city = $('#cCode option:selected').text();
+
+    var citySelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    if (oneId === ""){
+        citySelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        storeSelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+    }
+    var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+        if(data!=null && data.length !== 0){
+            var content='<option value="">选择门店</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#store").empty().append(content);
+        }else {
+            storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+        }
+    });
+    ajax1.set("oneId",city);
+    ajax1.start();
+};
+TQuestion.addSubmit = function(){
+
+    var data = {
+        id:null,
+        province:"",
+        provinceCode:"",
+        city:"",
+        cityCode:"",
+        storeId:null,
+        storeName:"",
+        parentName:"",
+        phone:"",
+        learnerName:"",
+        learnerAge:null,
+        birthday:"",
+        appointmentTime:"",
+        status:null,
+        state:null
+    };
+    data.id                      = $("#name").val()
+    data.province                = $('#pCode option:selected').text();
+    data.provinceCode            = $("#pCode").val()
+    data.city                    = $('#cCode option:selected').text();
+    data.cityCode                = $("#cCode").val()
+    data.storeId                 = $("#store").val()
+    data.storeName               = $('#store option:selected').text();
+    data.parentName              = $("#parentName").val()
+    data.phone                   = $("#phone").val()
+    data.learnerName             = $("#learnerName").val()
+    data.learnerAge              = $("#learnerAge").val()
+    data.birthday                = $("#birthday").val()
+    data.appointmentTime         = $("#appointmentTime").val().replace("T"," ")
+    console.log("看看")
+    console.log(data.appointmentTime);
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#store").val()=='' ){
+        Feng.info("请选择门店")
+        return;
+    }
+    if($("#parentName").val()=='' ){
+        Feng.info("请输入家长姓名")
+        return;
+    }
+
+    if($("#phone").val()=='' ){
+        Feng.info("请输入家长联系方式")
+        return;
+    }
+    if($("#learnerName").val()=='' ){
+        Feng.info("请输入学员姓名")
+        return;
+    }
+    if($("#learnerAge").val()=='' ){
+        Feng.info("请输入学员年龄")
+        return;
+    }
+    if($("#birthday").val()=='' ){
+        Feng.info("请选择学员生日")
+        return;
+    }
+    if($("#appointmentTime").val()=='' ){
+        Feng.info("请选择预约时间")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/bodySideAppointment/addBodySideAppointments" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+
+};
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['phone'] =     $("#phone").val();
+    queryData['parentName'] = $("#parentName").val();
+    queryData['state'] = $("#state").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+
+    $("#phone").val('');
+    $("#parentName").val('');
+    $("#state").val('');
+    TQuestion.search();
+};
+
+$(function () {
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/bodySideAppointment/listAll", defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js b/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js
new file mode 100644
index 0000000..612e13b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js
@@ -0,0 +1,350 @@
+/**
+ * 管理初始化
+ */
+var TQuestion = {
+    id: "TQuestionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TQuestion.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '视频类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"课后练习",2:"运动教学视频",3:"器材教学视频"}[data]
+            }
+        },
+        {title: '视频封面', field: 'coverDrawing', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                value = typeof value == "undefined" || value == '' ? '/static/img/NoPIC.png' : value;
+                return '<img src="' + value + '" style="height: 100px;"/>'
+            }
+        },
+        {title: '视频名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '视频简介', field: 'introduce', visible: true, align: 'center', valign: 'middle'},
+        {title: '可获积分', field: 'integral', visible: true, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"上架中",2:"下架中",3:"已失效"}[data]
+            }}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TQuestion.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TQuestion.seItem = selected[0];
+        return true;
+    }
+};
+TQuestion.dataCount = 0;
+TQuestion.phone = "";
+TQuestion.phoneId = "";
+
+/**
+ * 点击添加
+ */
+TQuestion.openAdd = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分类',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/benefits/add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TQuestion.openChange = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+            var index = layer.open({
+                type: 2,
+                title: '编辑分类',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/update/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 上架
+ */
+
+TQuestion.onShelf = function () {
+if (this.check()){
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    const data1 = {
+        ids:[],
+        state:null
+    };
+    selected.forEach(function(obj) {
+        var id = obj.id;
+        data1.ids.push(id);
+    });
+    data1.state = 1;
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/changeCourseState",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            Feng.success("上架成功!");
+            TQuestion.search();
+
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+
+}
+};
+
+
+/**
+ * 下架
+ */
+TQuestion.offShelf = function () {
+
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 查看详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/info/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查看视频详情
+ */
+TQuestion.getInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一条进行查看!");
+    }else {
+        if (this.check()){
+            var selected = $('#' + this.id).bootstrapTable('getSelections');
+
+            var index = layer.open({
+                type: 2,
+                title: '详情',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/benefits/getBenefitsVideos/' + TQuestion.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 删除
+ */
+TQuestion.delete = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 3;
+        $.ajax({
+            url: Feng.ctxPath + "/benefits/changeCourseState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("删除成功!");
+                TQuestion.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                Feng.error(errorMessage);
+            }
+        });
+    }
+};
+
+TQuestion.addSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name       = $("#name").val()
+    data.position           = $("#position").val()
+    data.sort           = $("#sort").val()
+
+
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+TQuestion.updateSubmit = function(){
+    var data = {
+        id:null,
+        name:"",
+        position:"",
+        sort:"",
+    };
+    data.name     = $("#name").val()
+    data.position = $("#position").val()
+    data.sort     = $("#sort").val()
+    data.id       = $("#dataId").val()
+    if($("#name").val()==''){
+        Feng.info("请输入分类名称")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择所在位置")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请输入排序")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/benefits/addBenefits" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+/**
+ * 查询列表
+ */
+TQuestion.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#position").val();
+    queryData['state'] = $("#state").val();
+    TQuestion.table.refresh({query: queryData});
+};
+
+
+/**
+ * 重置搜索
+ */
+TQuestion.resetSearch = function () {
+    $("#name").val('');
+    $("#state").val('');
+    $("#position").val('');
+    TQuestion.search();
+};
+
+$(function () {
+    var val = $("#id").val();
+    var defaultColunms = TQuestion.initColumn();
+    var table = new BSTable(TQuestion.id, "/benefits/listBenefitsVideos/"+val, defaultColunms);
+    table.setPaginationType("client");
+    TQuestion.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js
new file mode 100644
index 0000000..21e5424
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js
@@ -0,0 +1,318 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSite = {
+    id: "TSiteTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSite.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '类型名称', field: 'name', visible: true, align: 'center', valign: 'middle'
+        },
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSite.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSite.seItem = selected[0];
+        return true;
+    }
+};
+TSite.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+TSite.del = function () {
+    if (this.check()) {
+        let id = this.seItem.id;
+        let name = TSite.seItem.name
+        var operation = function(){
+            var data1={
+                id:id,
+                name:name,
+                state:null
+            }
+            $.ajax({
+                url: Feng.ctxPath + "/coursePackageType/delete",
+                type: "POST",
+                contentType: "application/json", // 设置请求头的 Content-Type
+                data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+                success: function(response) {
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                    if (response === 200) {
+                        Feng.success("删除成功!");
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                    }else{
+                        Feng.error("当前课包类型正在被使用,无法删除!");
+                    }
+                },
+                error: function(xhr, status, error) {
+                    var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+                    Feng.error(errorMessage);
+                }
+            });
+            layer.closeAll();
+        }
+        Feng.confirm("确认删除该信息?", operation);
+    }
+
+};
+/**
+ * 点击添加跨城站点管理
+ */
+TSite.openAddTSite = function () {
+    var index = layer.load(1,{
+        type: 1
+        , title: '添加场地类型'
+        , area: ['50%', '50%']
+        , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+        , id: 'layerDemo' //防止重复弹出cge
+        , content: '<div class="form-horizontal">' +
+            '                    <div class="col-sm-11" >' +
+            '                    <div class="col-sm-11">' +
+            '                        <div class="form-group">\n' +
+            '                            <label class="col-sm-3 control-label">类型名称:</label>\n' +
+            '                         <div class="col-sm-9">\n' +
+            '                                  <input class="form-control" type="text" id="name"> '+
+            '                            </div>\n' +
+            '                        </div>\n' +
+            '                       </div>' +
+            '                   </div>' +
+            '</div>'
+        , btn: ['关闭', '保存']
+        , btnAlign: 'c' //按钮居中
+        , shade:  0.5 //不显示遮罩
+        ,load:1
+        , yes: function () {
+            layer.closeAll();
+        },
+        btn2:function () {
+            let name = $("#name").val()
+            if(name==''){
+                Feng.info("请输入类型名称")
+                return false;
+            }
+            var ajax = new $ax(Feng.ctxPath + "/coursePackageType/add", function (data) {
+                if (data === 200) {
+                    Feng.success("操作成功!");
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                }else{
+                    Feng.error("当前课包类型已存在!");
+                }
+            }, function (data) {
+                Feng.error("操作失败!")
+            });
+            ajax.set("name", name);
+            ajax.start();
+            layer.closeAll();
+        }
+    });
+
+    this.layerIndex = index;
+};
+
+
+
+
+/**
+ * 打开查看跨城站点管理详情
+ */
+TSite.openTSiteDetail = function () {
+
+    if (this.check()) {
+        let id = TSite.seItem.id
+        let name = TSite.seItem.name
+        var index = layer.load(1,{
+            type: 1
+            , title: '编辑场地类型'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: '<div class="form-horizontal">' +
+                '                    <div class="col-sm-11" >' +
+                '                    <div class="col-sm-11">' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">类型名称:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control" type="text" id="name" value='+name+'> '+
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                       </div>' +
+                '                   </div>' +
+                '</div>'
+            , btn: ['关闭', '保存']
+            , btnAlign: 'c' //按钮居中
+            , shade:  0.5 //不显示遮罩
+            ,load:1
+            , yes: function () {
+                layer.closeAll();
+            },
+            btn2:function () {
+                let name = $("#name").val()
+                if(name==''){
+                    Feng.info("请输入类型名称")
+                    return false;
+                }
+                var data1={
+                    id:id,
+                    name:name,
+                    state:null
+                }
+                $.ajax({
+                    url: Feng.ctxPath + "/coursePackageType/update",
+                    type: "POST",
+                    contentType: "application/json", // 设置请求头的 Content-Type
+                    data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+                    success: function(response) {
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                        if (response === 200) {
+                            Feng.success("修改成功!");
+                            window.location.reload();
+                            window.parent.layer.closeAll();
+                        }else{
+                            Feng.error("当前课包类型已存在!");
+                        }
+                    },
+                    error: function(xhr, status, error) {
+                        var errorMessage = xhr.responseText ? xhr.responseText : "修改失败!";
+                        Feng.error(errorMessage);
+                    }
+                });
+                layer.closeAll();
+            }
+        });
+
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作跨城站点管理
+ */
+TSite.opt = function (type) {
+    if (this.check()) {
+        var name = TSite.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该站点";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        } else if (2 == type){
+            str = "冻结";
+            title = "您是否确认冻结"+name+"?";
+        } else if (3 == type){
+            str = "解冻";
+            title = "您是否确认解冻"+name+"?";
+        }
+        if (1 == type){
+            if (TSite.seItem.lineNum != "" && TSite.seItem.lineNum != null && TSite.seItem.lineNum > 0) {
+                swal("删除失败", "该站点还有关联线路!", "warning");
+                return;
+            }
+        }
+        if(2 == type){
+            if (TSite.seItem.state != 1) {
+                swal("冻结失败", "【正常】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+        if (3 == type){
+            if (TSite.seItem.state != 2){
+                swal("解冻失败", "【冻结】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tSite/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TSite.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tSiteId",TSite.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城站点管理列表
+ */
+TSite.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['insertUser'] = $("#insertUser").val();
+    queryData['city'] = $("#city").val();
+    queryData['state'] = $("#state").val();
+    TSite.table.refresh({query: queryData});
+};
+
+TSite.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#insertUser").val("");
+    $("#city").val("");
+    $("#state").val("");
+    TSite.search();
+};
+
+$(function () {
+    var defaultColunms = TSite.initColumn();
+    var table = new BSTable(TSite.id, "/coursePackageType/list", defaultColunms);
+    table.setPaginationType("client");
+    TSite.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js
new file mode 100644
index 0000000..a4ba943
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js
@@ -0,0 +1,527 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSite = {
+    id: "TSiteTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    picture:"",
+    fileUrl:"",
+    img:"",
+    plan:"",
+    goodsPicArray:[],
+    validateFields: {
+    }
+};
+var objectType =$("#objectType").val()
+/**
+ * 初始化表格的列
+ */
+TSite.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所在省', field: 'province', visible: objectType==1?true:false, align: 'center', valign: 'middle',width:'20%',
+        },
+        {title: '所在市', field: 'city', visible: objectType==1?true:false, align: 'center', valign: 'middle',
+        },
+        {title: '所属账号', field: 'nameAndPhone', visible: true, align: 'center', valign: 'middle'},
+        {title: '教练类型', field: 'coachTypeName', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '性别', field: 'gender', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"男",2:"女"}[data]
+            }
+        },
+        {title: '生日', field: 'birthday', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '联系电话', field: 'phone', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+            return {1:"正常",2:"冻结"}[data]
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSite.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSite.seItem = selected[0];
+        return true;
+    }
+};
+/**
+ * 上架
+ */
+
+TSite.onShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            type:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 1;
+
+        $.ajax({
+            url: Feng.ctxPath + "/tCoach/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("上架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 下架
+ */
+TSite.offShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            ids:[],
+            state:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.ids.push(id);
+        });
+        data1.state = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/tCoach/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+TSite.uploadFile = function(){
+    var elementById = document.getElementById("uploadFile");
+    var file = elementById.files[0];
+    var formData = new FormData();
+    formData.append('file',file);
+        $.ajax({
+            url: Feng.ctxPath + "/tCouponManage/uploadPic" ,
+            type: "POST",
+            data: formData,
+            contentType: false, // 设置为false,让浏览器自动识别并设置请求头
+            processData: false, // 设置为false,不处理发送的数据(因为FormData对象已经包含了文件数据)
+            success: function (response) {
+                TSite.fileUrl = response;
+                console.log(TSite.fileUrl);
+                Feng.success("文件上传成功");
+            },
+            error: function (xhr, status, error) {
+                Feng.error("文件上传失败!" + error);
+            }
+        });
+};
+TSite.getChange = function(e){
+    var oneId=$(e).val();
+    var selectedValue = e.value;
+    var citySelect = document.getElementById("cCode");
+
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.name+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (selectedValue === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+    }
+    ajax.set("province",oneId);
+    ajax.start();
+};
+// 场地管理首页 选择对应的省市
+// 传1是场地管理首页 传2是场地管理添加页面
+TSite.oneChange = function (e) {
+    var province = $('#pCode option:selected').text();
+    // var province = $('#pCode option:selected').text();
+    // var val = $('#pCode option:selected').val();
+    var citySelect = document.getElementById("cCode");
+    var ajax = new $ax(Feng.ctxPath + "/tCoach/getCity", function(data){
+        if(data!=null){
+                var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.cityCode+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (province === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+    }
+
+    ajax.set("province",province);
+    ajax.start();
+};
+
+TSite.oneChangeNext = function (e) {
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+
+    var oneId=$(e).val();
+    var citySelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/accountChangeNext", function(data){
+        if(data!=null){
+            var content='<option value="">选择账号</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    if (oneId === ""){
+        citySelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        storeSelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+    ajax.set("oneId",oneId);
+    ajax.start();
+
+    var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+        if(data!=null && data.length !== 0){
+            var content='<option value="">选择门店</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#store").empty().append(content);
+        }else {
+            storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+        }
+    });
+    ajax1.set("oneId",oneId);
+    ajax1.start();
+};
+/**
+ * 跳转添加场地页面
+ */
+TSite.openAddTSite = function () {
+
+    var index = layer.open({
+        type: 2,
+        title: "添加场地",
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCoach/addCoach'
+    });
+    this.layerIndex = index;
+};
+/**
+ * 跳转锁定场地页面
+ */
+TSite.lock = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个场地进行锁定!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "锁定场地",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tSite/lockSite/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理查看详情
+ */
+TSite.openInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "查看详情",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tCoach/infoCoach/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理编辑
+ */
+TSite.openEditTSite = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个教练进行编辑!");
+    }else {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: "编辑教练",
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCoach/updateCoach/' + TSite.seItem.id
+        });
+        this.layerIndex = index;
+    }
+    }
+};
+/**
+ * 关闭此对话框
+ */
+TSite.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+
+var sh = ""; // 门店经营开始时间:小时
+var sm = "";// 门店经营开始时间:分钟
+var eh = "";// 门店经营结束时间:小时
+var em = "";// 门店经营结束时间:分钟
+
+TSite.addSubmit = function(){
+
+    var data = {
+        province:"",
+        city:"",
+        cityManagerId:"",
+        storeId:"",
+        siteTypeId:null,
+        appointmentStartTime:"",
+        appointmentEndTime:"",
+        cashPrice:null,
+        playPaiCoin:null,
+        insuranceEndTime:"",
+        name:"",
+        insuranceImg:"",
+        managementPlan:""
+    };
+    data.province            = $("#pCode").val()
+    data.city                = $("#cCode").val()
+    data.cityManagerId       = $("#account").val()
+    data.storeId             = $("#store").val()
+    data.siteTypeId          = $("#siteTypeId").val()
+    data.appointmentStartTime= $("#start-time").val()
+    data.appointmentEndTime  = $("#end-time").val()
+    data.cashPrice           = $("#cashPrice").val()
+    data.playPaiCoin         = $("#playPaiCoin").val()
+    data.insuranceEndTime    = $("#insuranceEndTime").val()
+    data.name                = $("#name").val()
+    data.insuranceImg        = $("#img").val()
+    data.managementPlan      = $('#courseVideo').val()
+    var sh =data.appointmentStartTime.split(':')[0];
+    var sm =data.appointmentStartTime.split(':')[1];
+    var eh =data.appointmentEndTime.split(':')[0];
+    var em =data.appointmentEndTime.split(':')[1];
+
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请选择账号")
+        return;
+    }
+    if($("#store").val()=='' ){
+        Feng.info("请选择门店")
+        return;
+    }
+    if($("#siteTypeId").val()=='' ){
+        Feng.info("请选择场地类型")
+        return;
+    }
+    if($("#name").val()==''){
+        Feng.info("请输入场地名称")
+        return;
+    }
+    if($("#start-time").val()=='' ){
+        Feng.info("请输入可预约时间段 开始时间")
+        return;
+    }
+    if($("#end-time").val()==''){
+        Feng.info("请输入可预约时间段 结束时间")
+        return;
+    }
+    if($("#cashPrice").val()==''){
+        Feng.info("请输入现金价格")
+        return;
+    }
+    if($("#playPaiCoin").val()==''){
+        Feng.info("请输入玩湃币价格")
+        return;
+    }
+    if($("#insuranceEndTime").val()==''){
+        Feng.info("请输入场地责任险有效期")
+        return;
+    }
+
+    if($("#img").val()==''){
+        Feng.info("请上传场地责任有效期图片")
+        return;
+    }
+    if($('#courseVideo').val()==''){
+        Feng.info("请上传消防及应急管理方案")
+        return;
+    }
+    var sTime = document.getElementById("start-time"); //获取输入的开始时间
+    var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+    var rStime = ""; //门店的经营开始时间
+    var rEtime = ""; //门店的经营结束时间
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            rStime = response.startTime;
+            sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+
+            rEtime = response.endTime;
+            eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+
+            var start = sTime.value;
+            var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+            var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+            if (Number(sh)>Number(startHour)){
+                Feng.error("预约的开始时间不应小于营业开始时间!")
+                return false;
+            }else if(Number(sh) === Number(startHour) ){
+                if (Number(sm)>Number(startMinute)){
+                    Feng.error("预约的开始时间不应大于营业开始时间!")
+                    return false;
+                }
+            }else if (Number(eh)<Number(startHour)){
+                Feng.error("预约的开始时间不应大于营业结束时间!")
+                return false;
+            }else if(Number(eh)===Number(startHour)){
+                Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                return false;
+            }
+            var end = eTime.value;
+            var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+            var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+            if (Number(eh)<Number(endHour)){
+                Feng.error("预约的结束时间不应大于营业结束时间!")
+                return ;
+            }else if(Number(eh) === Number(endHour) ){
+                if (Number(em)<Number(endMinute)){
+                    Feng.error("预约的开始时间不应大于开始营业时间!")
+                    return ;
+                }
+            }else if(Number(sh)>Number(endHour)){
+                Feng.error("预约的结束时间不应小于营业开始时间!")
+                return ;
+            }
+            if (Number(endHour)===Number(sh)){
+                if(Number(endMinute) < Number(sm)){
+                    Feng.error("预约结束时间不应小于营业开始时间");
+                    return;
+                }
+            }
+            if (Number(startHour)===Number(endHour) && Number(startMinute)===Number(endMinute)){
+                Feng.error("至少预约半个小时");
+                return;
+            }
+            $.ajax({
+                url: Feng.ctxPath + "/tSite/addSite" ,
+                type: "POST",
+                data: JSON.stringify(data),
+                contentType: "application/json",
+                success: function (response) {
+                    Feng.success("添加成功");
+                    TSite.search();
+                },
+                error: function (xhr, status, error) {
+                    Feng.error("添加失败!" + error);
+                }
+            });
+        },
+        error: function (xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+            return false;
+        }
+    });
+};
+
+TSite.search = function () {
+    var queryData = {};
+    if ($("#pCode").val() === ""){
+        queryData['province'] = ""
+    }else{
+        queryData['province'] = $('#pCode option:selected').text();
+    }
+    if ($("#cCode").val() === ""){
+        queryData['city'] = ""
+    }else {
+        queryData['city'] = $('#cCode option:selected').text();
+    }
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    TSite.table.refresh({query: queryData});
+};
+
+TSite.resetSearch = function () {
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#name").val("");
+    $("#phone").val("");
+    TSite.search();
+};
+
+function UploadFileFn(){
+    $('#upFile').click();
+}
+
+$(function () {
+    var defaultColunms = TSite.initColumn();
+    var table = new BSTable(TSite.id, "/tCoach/list", defaultColunms);
+    table.setPaginationType("client");
+    TSite.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js
new file mode 100644
index 0000000..8c1338e
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js
@@ -0,0 +1,471 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSite = {
+    id: "TSiteTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    picture:"",
+    fileUrl:"",
+    img:"",
+    plan:"",
+    goodsPicArray:[],
+    validateFields: {
+    }
+};
+var objectType =$("#objectType").val()
+/**
+ * 初始化表格的列
+ */
+TSite.initColumn = function () {
+    return [
+        {field: 'selectItem', checkbox: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所在省', field: 'province', visible: objectType==1?true:false, align: 'center', valign: 'middle',width:'20%',
+        },
+        {title: '所在市', field: 'city', visible: objectType==1?true:false, align: 'center', valign: 'middle',
+        },
+        {title: '所属账号', field: 'nameAndPhone', visible: true, align: 'center', valign: 'middle'},
+        {title: '教练类型', field: 'coachTypeName', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '性别', field: 'gender', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+                return {1:"男",2:"女"}[data]
+            }
+        },
+        {title: '生日', field: 'birthday', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '联系电话', field: 'phone', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter:function (data) {
+            return {1:"正常",2:"冻结"}[data]
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSite.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSite.seItem = selected[0];
+        return true;
+    }
+};
+/**
+ * 上架
+ */
+
+TSite.onShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            siteIds:[],
+            type:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.siteIds.push(id);
+        });
+        data1.type = 1;
+
+        $.ajax({
+            url: Feng.ctxPath + "/tSite/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("上架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+/**
+ * 下架
+ */
+TSite.offShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            siteIds:[],
+            type:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.siteIds.push(id);
+        });
+        data1.type = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/tSite/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+TSite.uploadFile = function(){
+    var elementById = document.getElementById("uploadFile");
+    var file = elementById.files[0];
+    var formData = new FormData();
+    formData.append('file',file);
+        $.ajax({
+            url: Feng.ctxPath + "/tCouponManage/uploadPic" ,
+            type: "POST",
+            data: formData,
+            contentType: false, // 设置为false,让浏览器自动识别并设置请求头
+            processData: false, // 设置为false,不处理发送的数据(因为FormData对象已经包含了文件数据)
+            success: function (response) {
+                TSite.fileUrl = response;
+                console.log(TSite.fileUrl);
+                Feng.success("文件上传成功");
+            },
+            error: function (xhr, status, error) {
+                Feng.error("文件上传失败!" + error);
+            }
+        });
+};
+TSite.getChange = function(e){
+    var oneId=$(e).val();
+    var selectedValue = e.value;
+    var citySelect = document.getElementById("cCode");
+
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.name+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (selectedValue === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+    }
+    ajax.set("province",oneId);
+    ajax.start();
+};
+// 场地管理首页 选择对应的省市
+// 传1是场地管理首页 传2是场地管理添加页面
+TSite.oneChange = function () {
+    var province = $('#pCode option:selected').text();
+    var citySelect = document.getElementById("cCode");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getCity", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.cityCode+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (province === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+        $("#cCode").innerHTML = '<option value="">请先选择省/市</option>';
+    }
+
+    ajax.set("province",province);
+    ajax.start();
+};
+
+TSite.oneChangeNext = function (e) {
+    var oneId=$(e).val();
+    var city = $('#cCode option:selected').text();
+    var ajax = new $ax(Feng.ctxPath + "/tSite/accountChangeNext", function(data){
+        if(data!=null){
+            var content='<option value="">选择账号</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    if (oneId === ""){
+        $("#account").innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+
+    }
+    ajax.set("oneId",city);
+    ajax.start();
+
+    // var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+    //     if(data!=null && data.length !== 0){
+    //         var content='<option value="">选择门店</option>';
+    //         $.each(data, function(k,v) {
+    //             content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+    //         });
+    //         $("#store").empty().append(content);
+    //     }else {
+    //         storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+    //     }
+    // });
+    // ajax1.set("oneId",oneId);
+    // ajax1.start();
+};
+
+/**
+ * 跳转添加场地页面
+ */
+TSite.openAddTSite = function () {
+
+    var index = layer.open({
+        type: 2,
+        title: "添加场地",
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSite/add'
+    });
+    this.layerIndex = index;
+};
+/**
+ * 跳转锁定场地页面
+ */
+TSite.lock = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个场地进行锁定!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "锁定场地",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tSite/lockSite/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理查看详情
+ */
+TSite.openInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "查看详情",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tSite/openInfoTSite/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理编辑
+ */
+TSite.openEditTSite = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: "编辑场地",
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tSite/openEditTSite/' + TSite.seItem.id
+        });
+        this.layerIndex = index;
+    }
+    }
+};
+/**
+ * 关闭此对话框
+ */
+TSite.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+
+var sh = ""; // 门店经营开始时间:小时
+var sm = "";// 门店经营开始时间:分钟
+var eh = "";// 门店经营结束时间:小时
+var em = "";// 门店经营结束时间:分钟
+
+TSite.addSubmit = function(){
+
+
+    var data = {
+        id:null,
+        province:"",
+        provinceCode:"",
+        city:"",
+        cityCode:"",
+        cityManagerId:null,
+        coachTypeId:null,
+        name:"",
+        birthday:"",
+        gender:null,
+        phone:"",
+        idcard:"",
+        height:null,
+        weight:null,
+        graduateSchool:"",
+        diploma:"",
+        certificate:"",
+        certificateImg:"",
+    };
+    if ($("#dataId").val()!=="undefined"){
+        data.id = $("#dataId").val();
+    }
+    data.provinceCode       = $("#pCode").val()
+    data.province           = $('#pCode option:selected').text();
+    data.cityCode           = $("#cCode").val()
+    data.city               = $('#cCode option:selected').text();
+    data.cityManagerId      = $("#account").val()
+    data.coachTypeId         = $("#coachTypeId").val()
+    data.name               = $("#name").val()
+    data.birthday           = $("#birthday").val()
+    data.gender             = $("#gender").val()
+    data.phone              = $("#phone").val()
+    data.idcard             = $("#idcard").val()
+    data.height             = $("#height").val()
+    data.weight             = $("#weight").val()
+    data.graduateSchool     = $('#graduateSchool').val()
+    data.diploma            = $('#img').val()
+    data.certificate        = $('#certificate').val()
+
+    var temp = ""
+    TSite.goodsPicArray.forEach(function (data) {
+        temp = temp+","+data
+    });
+    data.certificateImg        = temp
+
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请选择账号")
+        return;
+    }
+    if($("#coachTypeId").val()=='' ){
+        Feng.info("请选择教练类型")
+        return;
+    }
+    if($("#name").val()=='' ){
+        Feng.info("请输入教练名称")
+        return;
+    }
+    if($("#birthday").val()==''){
+        Feng.info("请输入教练生日")
+        return;
+    }
+    if($("#gender").val()=='' ){
+        Feng.info("请选择教练性别")
+        return;
+    }
+    if($("#phone").val()==''){
+        Feng.info("请输入教练电话")
+        return;
+    }
+    if($("#idcard").val()==''){
+        Feng.info("请输入教练身份证号")
+        return;
+    }
+    if($("#height").val()==''){
+        Feng.info("请输入教练身高")
+        return;
+    }
+    if($("#weight").val()==''){
+        Feng.info("请输入教练体重")
+        return;
+    }
+    if($("#graduateSchool").val()==''){
+        Feng.info("请输入毕业院校")
+        return;
+    }
+    if($("#img").val()==''){
+        Feng.info("请输入毕业证图片")
+        return;
+    }
+    if($("#certificate").val()==''){
+        Feng.info("请输入资格证书")
+        return;
+    }
+    if(TSite.goodsPicArray.length === 0){
+        Feng.info("请上传资格证书图片")
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/tCoach/add" ,
+        type: "POST",
+        data: JSON.stringify(data),
+        contentType: "application/json",
+        success: function (response) {
+            Feng.success("添加成功");
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("添加失败!" + error);
+        }
+    });
+    TSite.search();
+};
+
+TSite.search = function () {
+    var queryData = {};
+    queryData['province'] = $('#pCode option:selected').text();
+    queryData['city'] = $('#cCode option:selected').text();
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    TSite.table.refresh({query: queryData});
+};
+
+TSite.resetSearch = function () {
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#name").val("");
+    $("#phone").val("");
+    TSite.search();
+};
+
+function UploadFileFn(){
+    $('#upFile').click();
+}
+
+$(function () {
+
+    var defaultColunms = TSite.initColumn();
+    var table = new BSTable(TSite.id, "/tCoach/list", defaultColunms);
+    table.setPaginationType("client");
+    TSite.table = table.init();
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js
new file mode 100644
index 0000000..b0b9dbc
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js
@@ -0,0 +1,393 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var TSiteInfo = {
+    layerIndex: -1,
+    validateFields: {
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TSiteInfo.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TSiteInfo.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSiteInfo.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSiteInfo.get = function(key) {
+    return $("#" + key).val();
+}
+
+// 场地管理首页 选择对应的省市
+TSiteInfo.oneChange = function (e) {
+    var oneId=$(e).val();
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+    var selectedValue = e.value;
+    var citySelect = document.getElementById("cCode");
+    var accountSelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getCity", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.city+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (selectedValue === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+    accountSelect.innerHTML = '<option value="">请先选择省/市</option>';
+    storeSelect.innerHTML = '<option value="">请先选择省/市</option>';
+    ajax.set("province",oneId);
+    ajax.start();
+};
+TSiteInfo.oneChangeNext = function (e) {
+    var selectedText = $('#cCode option:selected').text();
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+
+    var citySelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/accountChangeNext", function(data){
+        if(data!=null){
+            var content='<option value="">选择账号</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    if (selectedText === ""){
+        storeSelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        citySelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+
+    ajax.set("oneId",selectedText);
+    ajax.start();
+
+    var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+        if(data!=null && data.length !== 0){
+            var content='<option value="">选择门店</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#store").empty().append(content);
+        }else {
+            storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+        }
+    });
+    ajax1.set("oneId",selectedText);
+    ajax1.start();
+};
+TSiteInfo.getTime = function (e) {
+
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            var sTime = document.getElementById("start-time"); //获取输入的开始时间
+            var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+            var rStime = response.startTime; //门店的经营开始时间
+            var rEtime = response.endTime; //门店的经营结束时间
+
+            var sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            var sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+            console.log("门店经营开始时间")
+            console.log(sh)
+            console.log(sm)
+            rEtime = response.endTime;
+            var eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            var em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+            console.log("门店经营结束时间")
+            console.log(eh)
+            console.log(em)
+            sTime.addEventListener('change',function () {
+                var start = sTime.value;
+                var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+                var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+
+                if (Number(sh)>Number(startHour)){
+                    Feng.error("预约的开始时间不应小于营业开始时间!")
+                }else if(Number(sh) === Number(startHour) ){
+                    if (Number(sm)>Number(startMinute)){
+                        Feng.error("预约的开始时间不应大于营业开始时间!")
+                    }
+                }else if (Number(eh)<Number(startHour)){
+                    Feng.error("预约的开始时间不应大于营业结束时间!")
+                }else if(Number(eh)===Number(startHour)){
+                    Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                }
+            });
+            eTime.addEventListener('change',function () {
+                var end = eTime.value;
+                var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+                var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+                if (Number(eh)<Number(endHour)){
+                    Feng.error("预约的结束时间不应大于营业结束时间!")
+                }else if(Number(eh) === Number(endHour) ){
+                    if (Number(em)<Number(endMinute)){
+                        Feng.error("预约的开始时间不应大于开始营业时间!")
+                    }
+                }else if(Number(sh)>Number(endHour)){
+                    Feng.error("预约的结束时间不应小于营业开始时间!")
+                }
+            })
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("您的网络异常!");
+        }
+    });
+};
+function UploadFileFn(){
+    $('#upFile').click();
+}
+TSiteInfo.addSubmit = function(){
+    var data = {
+        id:null,
+        province:"",
+        city:"",
+        cityManagerId:"",
+        storeId:"",
+        siteTypeId:null,
+        appointmentStartTime:"",
+        appointmentEndTime:"",
+        cashPrice:null,
+        playPaiCoin:null,
+        insuranceEndTime:"",
+        name:"",
+        insuranceImg:"",
+        managementPlan:""
+    };
+    data.province            = $("#pCode").val()
+    data.id            = $("#id").val()
+    data.city                = $("#cCode").val()
+    data.cityManagerId       = $("#account").val()
+    data.storeId             = $("#store").val()
+    data.siteTypeId          = $("#siteTypeId").val()
+    data.appointmentStartTime= $("#start-time").val()
+    data.appointmentEndTime  = $("#end-time").val()
+    data.cashPrice           = $("#cashPrice").val()
+    data.playPaiCoin         = $("#playPaiCoin").val()
+    data.insuranceEndTime    = $("#insuranceEndTime").val()
+    data.name                = $("#name").val()
+    data.insuranceImg        = $("#img").val()
+    data.managementPlan      = $('#courseVideo').val()
+    var sh =data.appointmentStartTime.split(':')[0];
+    var sm =data.appointmentStartTime.split(':')[1];
+    var eh =data.appointmentEndTime.split(':')[0];
+    var em =data.appointmentEndTime.split(':')[1];
+
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请选择账号")
+        return;
+    }
+    if($("#store").val()=='' ){
+        Feng.info("请选择门店")
+        return;
+    }
+    if($("#siteTypeId").val()=='' ){
+        Feng.info("请选择场地类型")
+        return;
+    }
+    if($("#name").val()==''){
+        Feng.info("请输入场地名称")
+        return;
+    }
+    if($("#start-time").val()=='' ){
+        Feng.info("请输入可预约时间段 开始时间")
+        return;
+    }
+    if($("#end-time").val()==''){
+        Feng.info("请输入可预约时间段 结束时间")
+        return;
+    }
+    if($("#cashPrice").val()==''){
+        Feng.info("请输入现金价格")
+        return;
+    }
+    if($("#playPaiCoin").val()==''){
+        Feng.info("请输入玩湃币价格")
+        return;
+    }
+    if($("#insuranceEndTime").val()==''){
+        Feng.info("请输入场地责任险有效期")
+        return;
+    }
+
+    // if($("#img").val()==''){
+    //     Feng.info("请上传场地责任有效期图片")
+    //     return;
+    // }
+    if($('#courseVideo').val()==''){
+        Feng.info("请上传消防及应急管理方案")
+        return;
+    }
+    var sTime = document.getElementById("start-time"); //获取输入的开始时间
+    var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+    var rStime = ""; //门店的经营开始时间
+    var rEtime = ""; //门店的经营结束时间
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            rStime = response.startTime;
+            sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+
+            rEtime = response.endTime;
+            eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+
+            var start = sTime.value;
+            var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+            var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+            if (Number(sh)>Number(startHour)){
+                Feng.error("预约的开始时间不应小于营业开始时间!")
+                return false;
+            }else if(Number(sh) === Number(startHour) ){
+                if (Number(sm)>Number(startMinute)){
+                    Feng.error("预约的开始时间不应大于营业开始时间!")
+                    return false;
+                }
+            }else if (Number(eh)<Number(startHour)){
+                Feng.error("预约的开始时间不应大于营业结束时间!")
+                return false;
+            }else if(Number(eh)===Number(startHour)){
+                Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                return false;
+            }
+            var end = eTime.value;
+            var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+            var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+            if (Number(eh)<Number(endHour)){
+                Feng.error("预约的结束时间不应大于营业结束时间!")
+                return ;
+            }else if(Number(eh) === Number(endHour) ){
+                if (Number(em)<Number(endMinute)){
+                    Feng.error("预约的开始时间不应大于开始营业时间!")
+                    return ;
+                }
+            }else if(Number(sh)>Number(endHour)){
+                Feng.error("预约的结束时间不应小于营业开始时间!")
+                return ;
+            }
+            if (Number(endHour)===Number(sh)){
+                if(Number(endMinute) < Number(sm)){
+                    Feng.error("预约结束时间不应小于营业开始时间");
+                    return;
+                }
+            }
+            if (Number(startHour)===Number(endHour) && Number(startMinute)===Number(endMinute)){
+                Feng.error("至少预约半个小时");
+                return;
+            }
+            $.ajax({
+                url: Feng.ctxPath + "/tSite/updateSite" ,
+                type: "POST",
+                data: JSON.stringify(data),
+                contentType: "application/json",
+                success: function (response) {
+                    Feng.success("修改成功");
+                },
+                error: function (xhr, status, error) {
+                    Feng.error("修改失败!" + error);
+                }
+            });
+        },
+        error: function (xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+            return false;
+        }
+    });
+
+};
+/**
+ * 关闭此对话框
+ */
+TSiteInfo.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+function UploadFileFn(){
+    $('#upFile').click();
+}
+$(function () {
+    // 限制分钟选项为 0 和 30
+    var timeInputs = document.querySelectorAll('input[type="time"]');
+    timeInputs.forEach(function(input) {
+        input.addEventListener('change', function() {
+            var selectedTime = input.value;
+            var hour = selectedTime.split(':')[0];
+            var minute = selectedTime.split(':')[1];
+            if (minute < 30 &&minute>0) {
+                minute = '30';
+            } else if (minute >30) {
+                hour++;
+                minute = '00';
+                if (hour<10){
+                    hour = '0'+hour;
+                }
+            }
+            input.value = hour + ':' + minute;
+
+        });
+    });
+    Feng.initValidator("carInfoForm", TSiteInfo.validateFields);
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+
+    var carPhoto1 = new $WebUpload("url");
+    carPhoto1.setUploadBarId("progressBar");
+    carPhoto1.init();
+    TSiteInfo.getTime()
+
+
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js b/cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js
new file mode 100644
index 0000000..8ad8019
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js
@@ -0,0 +1,297 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSite = {
+    id: "TSiteTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSite.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '类型名称', field: 'name', visible: true, align: 'center', valign: 'middle'
+        },
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSite.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSite.seItem = selected[0];
+        return true;
+    }
+};
+TSite.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+TSite.del = function () {
+    if (this.check()) {
+        let id = this.seItem.id;
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/tCoachType/delete", function (data) {
+                Feng.success("删除成功!");
+                TSite.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!");
+            });
+            ajax.set("id",id);
+            ajax.start();
+        }
+        Feng.confirm("确认删除该信息?", operation);
+    }
+
+};
+/**
+ * 点击添加跨城站点管理
+ */
+TSite.openAddTSite = function () {
+    var index = layer.load(1,{
+        type: 1
+        , title: '添加场地类型'
+        , area: ['50%', '50%']
+        , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+        , id: 'layerDemo' //防止重复弹出cge
+        , content: '<div class="form-horizontal">' +
+            '                    <div class="col-sm-11" >' +
+            '                    <div class="col-sm-11">' +
+            '                        <div class="form-group">\n' +
+            '                            <label class="col-sm-3 control-label">类型名称:</label>\n' +
+            '                         <div class="col-sm-9">\n' +
+            '                                  <input class="form-control" type="text" id="name"> '+
+            '                            </div>\n' +
+            '                        </div>\n' +
+            '                       </div>' +
+            '                   </div>' +
+            '</div>'
+        , btn: ['关闭', '保存']
+        , btnAlign: 'c' //按钮居中
+        , shade:  0.5 //不显示遮罩
+        ,load:1
+        , yes: function () {
+            layer.closeAll();
+        },
+        btn2:function () {
+            let name = $("#name").val()
+            if(name==''){
+                Feng.info("请输入类型名称")
+                return false;
+            }
+            var ajax = new $ax(Feng.ctxPath + "/tCoachType/add", function (data) {
+                if (data === 200) {
+                    Feng.success("操作成功!");
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                }else{
+                    Feng.error("当前教练类型已存在!");
+                }
+            }, function (data) {
+                Feng.error("操作失败!")
+            });
+            ajax.set("name", name);
+            ajax.start();
+            layer.closeAll();
+        }
+    });
+
+    this.layerIndex = index;
+};
+
+
+
+
+/**
+ * 打开查看跨城站点管理详情
+ */
+TSite.openTSiteDetail = function () {
+
+    if (this.check()) {
+        let id = TSite.seItem.id
+        let name = TSite.seItem.name
+        var index = layer.load(1,{
+            type: 1
+            , title: '编辑场地类型'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: '<div class="form-horizontal">' +
+                '                    <div class="col-sm-11" >' +
+                '                    <div class="col-sm-11">' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">类型名称:</label>\n' +
+                '                         <div class="col-sm-9">\n' +
+                '                                  <input class="form-control" type="text" id="name" value='+name+'> '+
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                       </div>' +
+                '                   </div>' +
+                '</div>'
+            , btn: ['关闭', '保存']
+            , btnAlign: 'c' //按钮居中
+            , shade:  0.5 //不显示遮罩
+            ,load:1
+            , yes: function () {
+                layer.closeAll();
+            },
+            btn2:function () {
+                let name = $("#name").val()
+                if(name==''){
+                    Feng.info("请输入类型名称")
+                    return false;
+                }
+                var data1={
+                    id:id,
+                    name:name
+                }
+                $.ajax({
+                    url: Feng.ctxPath + "/tCoachType/update",
+                    type: "POST",
+                    contentType: "application/json", // 设置请求头的 Content-Type
+                    data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+                    success: function(response) {
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                        if (response === 200) {
+                            Feng.success("修改成功!");
+                            window.location.reload();
+                            window.parent.layer.closeAll();
+                        }else{
+                            Feng.error("当前教练类型已存在!");
+                        }
+                    },
+                    error: function(xhr, status, error) {
+                        var errorMessage = xhr.responseText ? xhr.responseText : "修改失败!";
+                        Feng.error(errorMessage);
+                    }
+                });
+                layer.closeAll();
+            }
+        });
+
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作跨城站点管理
+ */
+TSite.opt = function (type) {
+    if (this.check()) {
+        var name = TSite.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该站点";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        } else if (2 == type){
+            str = "冻结";
+            title = "您是否确认冻结"+name+"?";
+        } else if (3 == type){
+            str = "解冻";
+            title = "您是否确认解冻"+name+"?";
+        }
+        if (1 == type){
+            if (TSite.seItem.lineNum != "" && TSite.seItem.lineNum != null && TSite.seItem.lineNum > 0) {
+                swal("删除失败", "该站点还有关联线路!", "warning");
+                return;
+            }
+        }
+        if(2 == type){
+            if (TSite.seItem.state != 1) {
+                swal("冻结失败", "【正常】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+        if (3 == type){
+            if (TSite.seItem.state != 2){
+                swal("解冻失败", "【冻结】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tSite/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TSite.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tSiteId",TSite.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城站点管理列表
+ */
+TSite.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['insertUser'] = $("#insertUser").val();
+    queryData['city'] = $("#city").val();
+    queryData['state'] = $("#state").val();
+    TSite.table.refresh({query: queryData});
+};
+
+TSite.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#insertUser").val("");
+    $("#city").val("");
+    $("#state").val("");
+    TSite.search();
+};
+
+$(function () {
+    var defaultColunms = TSite.initColumn();
+    var table = new BSTable(TSite.id, "/tCoachType/list", defaultColunms);
+    table.setPaginationType("client");
+    TSite.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js b/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js
index 19bf113..0c7030f 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js
@@ -213,6 +213,7 @@
             success: function(response) {
                 Feng.success("删除成功!");
                 window.parent.TQuestion.table.refresh();
+                TQuestion.table.refresh();
             },
             error: function(xhr, status, error) {
                 var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
@@ -260,6 +261,7 @@
 };
 
 $(function () {
+
     const data1 = {
         id:null,
         phone:null,
@@ -361,6 +363,7 @@
                             data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
                             success: function(response) {
                                 Feng.success("添加成功!");
+                                TQuestion.table.refresh();
                                 // window.parent.TQuestion.table.refresh();
                                 TQuestion.phone = "";
                             },
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tSite/electricFence.js b/cloud-server-management/src/main/webapp/static/modular/system/tSite/electricFence.js
deleted file mode 100644
index 24acbbf..0000000
--- a/cloud-server-management/src/main/webapp/static/modular/system/tSite/electricFence.js
+++ /dev/null
@@ -1,327 +0,0 @@
-var map = new AMap.Map('container',{
-    resizeEnable: true,
-    zoom:10
-});
-
-
-var value = "";
-map.getCity(
-    callback=function (result) {
-        value = result.city;
-        drawBounds();
-    }
-);
-
-
-var mouseTool = new AMap.MouseTool(map);
-//监听draw事件可获取画好的覆盖物
-var overlays = [];
-var name = null;
-var coordinate = '';//存储坐标
-var objs = {//存储各种类型的覆盖物对象
-    "polyline":[],
-    "polygon":[],
-    "rectangle":[],
-    "circle":[]
-};
-var editors = [];
-mouseTool.on('draw',function(e){
-    overlays.push(e.obj);
-
-    switch (name) {
-        case 'polyline':{//折线图
-            var polyline = e.obj.getPath();
-            getCoordinate(polyline);
-            objs.polyline.push(e.obj);
-            break;
-        }
-        case 'polygon':{//多边形
-            var polygon = e.obj.getPath();
-            getCoordinate(polygon);
-            objs.polygon.push(e.obj);
-            break;
-        }
-        case 'rectangle':{//矩形
-            var rectangle = e.obj.getPath();
-            getCoordinate(rectangle);
-            objs.rectangle.push(e.obj);
-            break;
-        }
-        case 'circle':{//圆形
-            var center = e.obj.getCenter();
-            var radius = e.obj.getRadius();
-            if(radius > 5000){
-                Feng.error("创建电子围栏失败,圆半径不能大于5000米");
-                return;
-            }
-            coordinate += center.lng + ',' + center.lat + ';' + radius + "_";
-            objs.circle.push(e.obj);
-            break;
-        }
-    }
-})
-
-
-var district = null;
-var polygons=[];
-function drawBounds() {
-    if(value == ''){
-        value = '北京市';
-    }
-
-    //加载行政区划插件
-    if(!district){
-        //实例化DistrictSearch
-        var opts = {
-            subdistrict: 0,   //获取边界不需要返回下级行政区
-            extensions: 'all',  //返回行政区边界坐标组等具体信息
-            level: 'district'  //查询行政级别为 市
-        };
-        district = new AMap.DistrictSearch(opts);
-    }
-    //行政区查询
-    district.setLevel(document.getElementById('level').value)
-    district.search(value, function(status, result) {
-        map.remove(polygons)//清除上次结果
-        polygons = [];
-        var bounds = result.districtList[0].boundaries;
-        if (bounds) {
-            for (var i = 0, l = bounds.length; i < l; i++) {
-                //生成行政区划polygon
-                var polygon = new AMap.Polygon({
-                    strokeWeight: 1,
-                    path: bounds[i],
-                    fillOpacity: 0.4,
-                    fillColor: '#80d8ff',
-                    strokeColor: '#0091ea'
-                });
-                polygons.push(polygon);
-            }
-        }
-        map.add(polygons)
-        map.setFitView(polygons);//视口自适应
-    });
-}
-
-document.getElementById('find').onclick = function () {
-    value = document.getElementById('district').value;
-    if(value == ''){
-        value = "北京市";
-    }
-    drawBounds()
-};
-document.getElementById('district').onkeydown = function(e) {
-    if (e.keyCode === 13) {
-        value = document.getElementById('district').value;
-        if(value == ''){
-            value = "北京市";
-        }
-        drawBounds();
-        return false;
-    }
-    return true;
-};
-
-
-
-
-//处理坐标结果
-function getCoordinate(arr){
-    var str = '';
-    for(var i = 0; i < arr.length; i++){
-        var lng = arr[i].lng;
-        var lat = arr[i].lat;
-        str += lng + ',' + lat + ';';
-    }
-    coordinate += str.substring(0, str.length - 1) + "_";
-}
-
-
-function draw(type){
-    switch(type){
-        case 'marker':{
-            mouseTool.marker({
-                //同Marker的Option设置
-            });
-            break;
-        }
-        case 'polyline':{
-            mouseTool.polyline({
-                strokeColor:'#80d8ff'
-                //同Polyline的Option设置
-            });
-            break;
-        }
-        case 'polygon':{
-            mouseTool.polygon({
-                fillColor:'#00b0ff',
-                strokeColor:'#80d8ff'
-                //同Polygon的Option设置
-            });
-            break;
-        }
-        case 'rectangle':{
-            mouseTool.rectangle({
-                fillColor:'#00b0ff',
-                strokeColor:'#80d8ff'
-                //同Polygon的Option设置
-            });
-            break;
-        }
-        case 'circle':{
-            mouseTool.circle({
-                fillColor:'#00b0ff',
-                strokeColor:'#80d8ff'
-                //同Circle的Option设置
-            });
-            break;
-        }
-    }
-}
-var radios = document.getElementsByName('func');
-for(var i=0;i<radios.length;i+=1){
-    radios[i].onchange = function(e){
-        draw(e.target.value)
-        name = e.target.value;
-    }
-}
-// draw('marker')
-
-document.getElementById('clear').onclick = function(){
-    map.remove(overlays)
-    overlays = [];
-    coordinate = '';
-    objs.circle = [];
-    objs.rectangle = [];
-    objs.polygon = [];
-    objs.polyline = [];
-    closeEdit();
-}
-document.getElementById('close').onclick = function(){
-    mouseTool.close()//关闭,并清除覆盖物
-    for(var i=0;i<radios.length;i+=1){
-        radios[i].checked = false;
-    }
-    closeEdit();
-}
-
-
-//点击提交处理函数
-function submitCoordinate(){
-    var name = $('#addressName').val();
-    if('' == name){
-        Feng.error('请填写地址名称');
-        return;
-    }
-    if('' == coordinate){
-        Feng.error('请在地图上规划区域');
-        return;
-    }
-    coordinate = coordinate.substring(0, coordinate.length - 1);
-
-}
-
-function editAll() {
-    coordinate = '';
-    editors = [];
-    //折线
-    for(var i in objs.polyline){
-        var polyline = objs.polyline[i];
-        var polyEditor = new AMap.PolyEditor(map, polyline)
-        polyEditor.on('addnode', function(event) {
-            // log.info('触发事件:addnode')
-        })
-
-        polyEditor.on('adjust', function(event) {
-            // log.info('触发事件:adjust')
-        })
-
-        polyEditor.on('removenode', function(event) {
-            // log.info('触发事件:removenode')
-        })
-
-        polyEditor.on('end', function(e) {
-            var polyline = e.target.getPath();
-            getCoordinate(polyline);
-        })
-        editors.push(polyEditor);
-        polyEditor.open();
-    }
-
-    //多边形
-    for(var i in objs.polygon){
-        var polygon = objs.polygon[i];
-        var polyEditor = new AMap.PolyEditor(map, polygon)
-
-        polyEditor.on('addnode', function(event) {
-            // log.info('触发事件:addnode')
-        })
-
-        polyEditor.on('adjust', function(event) {
-            // log.info('触发事件:adjust')
-        })
-
-        polyEditor.on('removenode', function(event) {
-            // log.info('触发事件:removenode')
-        })
-
-        polyEditor.on('end', function(e) {
-            var polygon = e.target.getPath();
-            getCoordinate(polygon);
-        })
-        editors.push(polyEditor);
-        polyEditor.open();
-    }
-
-
-    //矩形
-    for(var i in objs.rectangle){
-        var rectangle = objs.rectangle[i];
-        var rectangleEditor = new AMap.RectangleEditor(map, rectangle)
-
-        rectangleEditor.on('adjust', function(event) {
-            // log.info('触发事件:adjust')
-        })
-
-        rectangleEditor.on('end', function(e) {
-            var polygon = e.target.getPath();
-            getCoordinate(polygon);
-        })
-        editors.push(rectangleEditor);
-        rectangleEditor.open();
-    }
-
-    //圆形
-    for(var i in objs.circle){
-        var circle = objs.circle[i];
-        var circleEditor = new AMap.CircleEditor(map, circle)
-
-        circleEditor.on('move', function(event) {
-            // log.info('触发事件:move')
-        })
-
-        circleEditor.on('adjust', function(e) {
-            var radius = e.target.getRadius();
-            if(radius > 5000){
-                Feng.error("创建电子围栏失败,圆半径不能大于5000米");
-                return;
-            }
-        })
-
-        circleEditor.on('end', function(e) {
-            var center = e.target.getCenter();
-            var radius = e.target.getRadius();
-            coordinate += center.lng + ',' + center.lat + ';' + radius + "_";
-        })
-        editors.push(circleEditor);
-        circleEditor.open();
-    }
-}
-
-
-function closeEdit() {
-    for(var i in editors){
-        var editor = editors[i];
-        editor.close();
-    }
-}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
index efb9b57..3c90189 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
@@ -5,26 +5,33 @@
     id: "TSiteTable",	//表格id
     seItem: null,		//选中的条目
     table: null,
-    layerIndex: -1
+    layerIndex: -1,
+    picture:"",
+    fileUrl:"",
+    img:"",
+    plan:"",
+    goodsPicArray:[],
+    validateFields: {
+    }
 };
-
+var objectType =$("#objectType").val()
 /**
  * 初始化表格的列
  */
 TSite.initColumn = function () {
     return [
-        {field: 'selectItem', radio: true},
+        {field: 'selectItem', checkbox: true},
         {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
-        {title: '省', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
+        {title: '省', field: 'province', visible: objectType==1?true:false, align: 'center', valign: 'middle',width:'20%',
         },
-        {title: '市', field: 'name', visible: true, align: 'center', valign: 'middle',
+        {title: '市', field: 'city', visible: objectType==1?true:false, align: 'center', valign: 'middle',
         },
-        {title: '门店名称', field: 'insertUserId', visible: false, align: 'center', valign: 'middle'},
-        {title: '场地类型', field: 'insertUser', visible: true, align: 'center', valign: 'middle',
+        {title: '门店名称', field: 'storeName', visible: true, align: 'center', valign: 'middle'},
+        {title: '场地类型', field: 'siteTypeName', visible: true, align: 'center', valign: 'middle',
         },
-        {title: '场地名称', field: 'province', visible: true, align: 'center', valign: 'middle',
+        {title: '场地名称', field: 'name', visible: true, align: 'center', valign: 'middle',
         },
-        {title: '场地责任险有效期', field: 'lineNum', visible: true, align: 'center', valign: 'middle',
+        {title: '场地责任险有效期', field: 'insuranceEndTime', visible: true, align: 'center', valign: 'middle',
         },
         {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
             formatter:function (data) {
@@ -47,149 +54,544 @@
         return true;
     }
 };
-TSite.oneChange = function (e) {
-    var oneId=$(e).val();
-    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
-        if(data!=null){
-            if(language==1){
-                var content='<option value="">选择市</option>';
-            }else if(language==2){
-                var content='<option value="">Choose your franchisee</option>';
-            }else {
-                var content='<option value="">Pilih franchisee Anda</option>';
+/**
+ * 上架
+ */
+
+TSite.onShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            siteIds:[],
+            type:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.siteIds.push(id);
+        });
+        data1.type = 1;
+
+        $.ajax({
+            url: Feng.ctxPath + "/tSite/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("上架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+                Feng.error("您的网络异常!");
             }
+        });
+    }
+};
+/**
+ * 下架
+ */
+TSite.offShelf = function () {
+    if (this.check()){
+        var selected = $('#' + this.id).bootstrapTable('getSelections');
+        const data1 = {
+            siteIds:[],
+            type:null
+        };
+        selected.forEach(function(obj) {
+            var id = obj.id;
+            data1.siteIds.push(id);
+        });
+        data1.type = 2;
+        $.ajax({
+            url: Feng.ctxPath + "/tSite/changeState",
+            type: "POST",
+            contentType: "application/json", // 设置请求头的 Content-Type
+            data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+            success: function(response) {
+                Feng.success("下架成功!");
+                TSite.search();
+            },
+            error: function(xhr, status, error) {
+                var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+                Feng.error("您的网络异常!");
+            }
+        });
+    }
+};
+TSite.uploadFile = function(){
+    var elementById = document.getElementById("uploadFile");
+    var file = elementById.files[0];
+    var formData = new FormData();
+    formData.append('file',file);
+        $.ajax({
+            url: Feng.ctxPath + "/tCouponManage/uploadPic" ,
+            type: "POST",
+            data: formData,
+            contentType: false, // 设置为false,让浏览器自动识别并设置请求头
+            processData: false, // 设置为false,不处理发送的数据(因为FormData对象已经包含了文件数据)
+            success: function (response) {
+                TSite.fileUrl = response;
+                console.log(TSite.fileUrl);
+                Feng.success("文件上传成功");
+            },
+            error: function (xhr, status, error) {
+                Feng.error("文件上传失败!" + error);
+            }
+        });
+};
+TSite.getChange = function(e){
+    var oneId=$(e).val();
+    var selectedValue = e.value;
+    var citySelect = document.getElementById("cCode");
+
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
             $.each(data, function(k,v) {
-                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+                content += "<option value='"+v.name+"'>"+v.name+"</option>";
             });
             $("#cCode").empty().append(content);
         }
     });
+    if (selectedValue === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+    }
+    ajax.set("province",oneId);
+    ajax.start();
+};
+// 场地管理首页 选择对应的省市
+// 传1是场地管理首页 传2是场地管理添加页面
+TSite.oneChange = function (e) {
+    var selectElement = document.getElementById('store');
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+    if (startTime!==null){
+        startTime.disabled = true;
+        endTime.disabled = true;
+        selectElement.addEventListener('change',function () {
+            if (selectElement.value !== ''){
+                startTime.disabled = false;
+                endTime.disabled = false;
+            }else{
+                startTime.disabled = true;
+                endTime.disabled = true;
+            }
+        });
+    }
+
+    var province = $('#pCode option:selected').text();
+    var val = $('#pCode option:selected').val();
+
+    var citySelect = document.getElementById("cCode");
+    var accountSelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getCity", function(data){
+        if(data!=null){
+                var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.city+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (val === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+
+    }
+    if (e===2){
+        accountSelect.innerHTML = '<option value="">请先选择省/市</option>';
+        storeSelect.innerHTML = '<option value="">请先选择省/市</option>';
+    }
+    if (val === ""){
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+
+    ajax.set("province",province);
+    ajax.start();
+};
+
+TSite.oneChangeNext = function (e) {
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+
+    var oneId=$(e).val();
+    var citySelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/accountChangeNext", function(data){
+        if(data!=null){
+            var content='<option value="">选择账号</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    if (oneId === ""){
+        citySelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        storeSelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
     ajax.set("oneId",oneId);
     ajax.start();
-}
+
+    var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+        if(data!=null && data.length !== 0){
+            var content='<option value="">选择门店</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#store").empty().append(content);
+        }else {
+            storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+        }
+    });
+    ajax1.set("oneId",oneId);
+    ajax1.start();
+};
 /**
- * 点击添加跨城站点管理
+ * 跳转添加场地页面
  */
 TSite.openAddTSite = function () {
+
     var index = layer.open({
         type: 2,
-        title: language==1?'添加':(language==2?'Add':'Tambahkan'),
+        title: "添加场地",
         area: ['100%', '100%'], //宽高
         fix: false, //不固定
         maxmin: true,
-        content: Feng.ctxPath + '/tSite/tSite_add'
+        content: Feng.ctxPath + '/tSite/add'
     });
     this.layerIndex = index;
 };
-
 /**
- * 打开查看跨城站点管理详情
+ * 跳转锁定场地页面
  */
-TSite.openTSiteDetail = function () {
+TSite.lock = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个场地进行锁定!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "锁定场地",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tSite/lockSite/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理查看详情
+ */
+TSite.openInfo = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
+        if (this.check()) {
+            var index = layer.open({
+                type: 2,
+                title: "查看详情",
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tSite/openInfoTSite/' + TSite.seItem.id
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 打开场地管理编辑
+ */
+TSite.openEditTSite = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length >1 ){
+        Feng.info("只能选择一个问题进行编辑!");
+    }else {
     if (this.check()) {
         var index = layer.open({
             type: 2,
-            title: language==1?'编辑':(language==2?'Edit':'Edit'),
+            title: "编辑场地",
             area: ['100%', '100%'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/tSite/tSite_update/' + TSite.seItem.id
+            content: Feng.ctxPath + '/tSite/openEditTSite/' + TSite.seItem.id
         });
         this.layerIndex = index;
     }
-};
-
-/**
- * 操作跨城站点管理
- */
-TSite.opt = function (type) {
-    if (this.check()) {
-        var name = TSite.seItem.name;
-        if (name == "" || name == null || name == undefined) {
-            name = "该站点";
-        } else {
-            name = "【" + name + "】";
-        }
-        var str = "";
-        var text = "请谨慎操作!";
-        var title = "请谨慎操作!";
-        if (1 == type){
-            str = "删除";
-            title = "您是否确认删除"+name+"?";
-            text = "请谨慎操作,删除后数据无法恢复!";
-        } else if (2 == type){
-            str = "冻结";
-            title = "您是否确认冻结"+name+"?";
-        } else if (3 == type){
-            str = "解冻";
-            title = "您是否确认解冻"+name+"?";
-        }
-        if (1 == type){
-            if (TSite.seItem.lineNum != "" && TSite.seItem.lineNum != null && TSite.seItem.lineNum > 0) {
-                swal("删除失败", "该站点还有关联线路!", "warning");
-                return;
-            }
-        }
-        if(2 == type){
-            if (TSite.seItem.state != 1) {
-                swal("冻结失败", "【正常】状态下才能执行此操作!", "warning");
-                return;
-            }
-        }
-        if (3 == type){
-            if (TSite.seItem.state != 2){
-                swal("解冻失败", "【冻结】状态下才能执行此操作!", "warning");
-                return;
-            }
-        }
-
-        swal({
-            title: title,
-            text: text,
-            type: "warning",
-            showCancelButton: true,
-            confirmButtonColor: "#DD6B55",
-            confirmButtonText: str,
-            closeOnConfirm: true
-        }, function () {
-            var ajax = new $ax(Feng.ctxPath + "/tSite/opt", function (data) {
-                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
-                TSite.table.refresh();
-            }, function (data) {
-                swal(str+"失败", data.responseJSON.message + "!", "warning");
-            });
-            ajax.set("tSiteId",TSite.seItem.id);
-            ajax.set("optType", type);
-            ajax.start();
-        });
     }
 };
-
 /**
- * 查询跨城站点管理列表
+ * 关闭此对话框
  */
+TSite.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+
+var sh = ""; // 门店经营开始时间:小时
+var sm = "";// 门店经营开始时间:分钟
+var eh = "";// 门店经营结束时间:小时
+var em = "";// 门店经营结束时间:分钟
+
+TSite.addSubmit = function(){
+
+    var data = {
+        province:"",
+        city:"",
+        cityManagerId:"",
+        storeId:"",
+        siteTypeId:null,
+        appointmentStartTime:"",
+        appointmentEndTime:"",
+        cashPrice:null,
+        playPaiCoin:null,
+        insuranceEndTime:"",
+        name:"",
+        insuranceImg:"",
+        managementPlan:""
+    };
+    data.province            = $("#pCode").val()
+    data.city                = $("#cCode").val()
+    data.cityManagerId       = $("#account").val()
+    data.storeId             = $("#store").val()
+    data.siteTypeId          = $("#siteTypeId").val()
+    data.appointmentStartTime= $("#start-time").val()
+    data.appointmentEndTime  = $("#end-time").val()
+    data.cashPrice           = $("#cashPrice").val()
+    data.playPaiCoin         = $("#playPaiCoin").val()
+    data.insuranceEndTime    = $("#insuranceEndTime").val()
+    data.name                = $("#name").val()
+    data.insuranceImg        = $("#img").val()
+    data.managementPlan      = $('#courseVideo').val()
+    var sh =data.appointmentStartTime.split(':')[0];
+    var sm =data.appointmentStartTime.split(':')[1];
+    var eh =data.appointmentEndTime.split(':')[0];
+    var em =data.appointmentEndTime.split(':')[1];
+
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请选择账号")
+        return;
+    }
+    if($("#store").val()=='' ){
+        Feng.info("请选择门店")
+        return;
+    }
+    if($("#siteTypeId").val()=='' ){
+        Feng.info("请选择场地类型")
+        return;
+    }
+    if($("#name").val()==''){
+        Feng.info("请输入场地名称")
+        return;
+    }
+    if($("#start-time").val()=='' ){
+        Feng.info("请输入可预约时间段 开始时间")
+        return;
+    }
+    if($("#end-time").val()==''){
+        Feng.info("请输入可预约时间段 结束时间")
+        return;
+    }
+    if($("#cashPrice").val()==''){
+        Feng.info("请输入现金价格")
+        return;
+    }
+    if($("#playPaiCoin").val()==''){
+        Feng.info("请输入玩湃币价格")
+        return;
+    }
+    if($("#insuranceEndTime").val()==''){
+        Feng.info("请输入场地责任险有效期")
+        return;
+    }
+
+    if($("#img").val()==''){
+        Feng.info("请上传场地责任有效期图片")
+        return;
+    }
+    if($('#courseVideo').val()==''){
+        Feng.info("请上传消防及应急管理方案")
+        return;
+    }
+    var sTime = document.getElementById("start-time"); //获取输入的开始时间
+    var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+    var rStime = ""; //门店的经营开始时间
+    var rEtime = ""; //门店的经营结束时间
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            rStime = response.startTime;
+            sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+
+            rEtime = response.endTime;
+            eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+
+            var start = sTime.value;
+            var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+            var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+            if (Number(sh)>Number(startHour)){
+                Feng.error("预约的开始时间不应小于营业开始时间!")
+                return false;
+            }else if(Number(sh) === Number(startHour) ){
+                if (Number(sm)>Number(startMinute)){
+                    Feng.error("预约的开始时间不应大于营业开始时间!")
+                    return false;
+                }
+            }else if (Number(eh)<Number(startHour)){
+                Feng.error("预约的开始时间不应大于营业结束时间!")
+                return false;
+            }else if(Number(eh)===Number(startHour)){
+                Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                return false;
+            }
+            var end = eTime.value;
+            var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+            var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+            if (Number(eh)<Number(endHour)){
+                Feng.error("预约的结束时间不应大于营业结束时间!")
+                return ;
+            }else if(Number(eh) === Number(endHour) ){
+                if (Number(em)<Number(endMinute)){
+                    Feng.error("预约的开始时间不应大于开始营业时间!")
+                    return ;
+                }
+            }else if(Number(sh)>Number(endHour)){
+                Feng.error("预约的结束时间不应小于营业开始时间!")
+                return ;
+            }
+            if (Number(endHour)===Number(sh)){
+                if(Number(endMinute) < Number(sm)){
+                    Feng.error("预约结束时间不应小于营业开始时间");
+                    return;
+                }
+            }
+            if (Number(startHour)===Number(endHour) && Number(startMinute)===Number(endMinute)){
+                Feng.error("至少预约半个小时");
+                return;
+            }
+            $.ajax({
+                url: Feng.ctxPath + "/tSite/addSite" ,
+                type: "POST",
+                data: JSON.stringify(data),
+                contentType: "application/json",
+                success: function (response) {
+                    Feng.success("添加成功");
+                    TSite.search();
+                },
+                error: function (xhr, status, error) {
+                    Feng.error("添加失败!" + error);
+                }
+            });
+        },
+        error: function (xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+            return false;
+        }
+    });
+};
+
 TSite.search = function () {
     var queryData = {};
-    queryData['insertTime'] = $("#insertTime").val();
+    queryData['province'] = $("#pCode").val();
+    queryData['city'] = $("#cCode").val();
+    queryData['siteTypeId'] = $("#sCode").val();
+    // 场地名称
     queryData['name'] = $("#name").val();
-    queryData['insertUser'] = $("#insertUser").val();
-    queryData['city'] = $("#city").val();
-    queryData['state'] = $("#state").val();
+    // 门店名称
+    queryData['storeName'] = $("#storeName").val();
     TSite.table.refresh({query: queryData});
 };
 
 TSite.resetSearch = function () {
-    $("#insertTime").val("");
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#store").val("");
+    $("#sCode").val("");
+    $("#storeName").val("");
+    $("#siteTypeId").val("");
     $("#name").val("");
-    $("#insertUser").val("");
-    $("#city").val("");
-    $("#state").val("");
+    $("#insuranceEndTime").val("");
     TSite.search();
 };
 
+function UploadFileFn(){
+    $('#upFile').click();
+}
+
 $(function () {
+    // 限制分钟选项为 0 和 30
+    var timeInputs = document.querySelectorAll('input[type="time"]');
+    timeInputs.forEach(function(input) {
+        input.addEventListener('change', function() {
+            var selectedTime = input.value;
+            var hour = selectedTime.split(':')[0];
+            var minute = selectedTime.split(':')[1];
+            if (minute < 30 &&minute>0) {
+                minute = '30';
+            } else if (minute >30) {
+                hour++;
+                minute = '00';
+                if (hour<10){
+                    hour = '0'+hour;
+                }
+            }
+                input.value = hour + ':' + minute;
+        });
+    });
+
+
     var defaultColunms = TSite.initColumn();
-    var table = new BSTable(TSite.id, "/tSite/list", defaultColunms);
-    table.setPaginationType("server");
+    var type =$("#type").val();
+    if (type !== 1){
+        var table1 = new BSTable(TSite.id, "/tSite/listExipre", defaultColunms);
+        table1.setPaginationType("client");
+        TSite.table = table1.init();
+    }
+    var table = new BSTable(TSite.id, "/tSite/listAll", defaultColunms);
+    table.setPaginationType("client");
     TSite.table = table.init();
+    Feng.initValidator("carInfoForm", TSite.validateFields);
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    $('#upFile').on('change', function () {
+        var formData = new FormData()  //创建一个forData
+        formData.append('file', $('#upFile')[0].files[0]) //把file添加进去  name命名为img
+        layer.load(); //上传loading
+        $.ajax({
+            url: Feng.ctxPath + '/mgr/uploadFile',
+            data: formData,
+            type: "POST",
+            async: true,
+            cache: false,
+            contentType: false,
+            processData: false,
+            success: function(res) {
+                layer.closeAll('loading'); //关闭loading
+                $('#upFile').val('');
+                $('#courseVideo').val(res);
+            }
+        })
+    });
 });
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js
new file mode 100644
index 0000000..5ed6829
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js
@@ -0,0 +1,79 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSiteLock = {
+    layerIndex: -1,
+    validateFields: {
+    }
+};
+
+/**
+ * 关闭此对话框
+ */
+TSiteLock.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+/**
+ * 添加
+ */
+TSiteLock.add = function(id) {
+    console.log("看看id");
+    console.log(id)
+    var startTime = $("#start-time").val().replace("T"," ");
+    var endTime =   $("#end-time").val().replace("T"," ");
+    data1 = {
+        siteId:id,
+        ssTime:startTime,
+        eeTime:endTime
+    };
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/addSiteLock",
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+        success: function(response) {
+            console.log("看看后端返回的id");
+            console.log(response.data);
+            var str = '<tr class="timeClass">' +
+                '<td><span>' + startTime +'</span></td>' +
+                '<td><span>' + endTime + '</span></td>' +
+                '<td><button '+'id = '+response.data+' + onclick="TSiteLock.delete(this)">删除</button></td></tr>';
+            $("#coun").append(str);
+            Feng.success("锁定成功!");
+        },
+        error: function(xhr, status, error) {
+            Feng.error("您的网络异常!");
+        }
+    });
+}
+/**
+ * 删除
+ */
+TSiteLock.delete = function(e) {
+    $(e).parent().parent().remove();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/deleteSiteLock/"+e.id,
+        type: "POST",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function(response) {
+            Feng.success("删除成功!");
+            TSite.search();
+        },
+        error: function(xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "删除失败!";
+            Feng.error("您的网络异常!");
+        }
+    });
+}
+
+
+function UploadFileFn(){
+    $('#upFile').click();
+}
+
+
+$(function () {
+
+
+
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js
index 6b6928f..b0b9dbc 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js
@@ -1,41 +1,27 @@
 /**
- * 初始化跨城站点管理详情对话框
+ * 初始化车辆管理详情对话框
  */
-var TSiteInfoDlg = {
-    tSiteInfoData : {},
+var language=1;
+var TSiteInfo = {
+    layerIndex: -1,
     validateFields: {
-        name: {
-            validators: {
-                notEmpty: {
-                    message: '站点名称不能为空'
-                }
-            }
-        },
-        provinceCode: {
-            validators: {
-                notEmpty: {
-                    message: '请选择站点所属省'
-                }
-            }
-        },
     }
 };
 
 /**
  * 验证数据是否为空
  */
-TSiteInfoDlg.validate = function () {
-    $('#siteInfoForm').data("bootstrapValidator").resetForm();
-    $('#siteInfoForm').bootstrapValidator('validate');
-    return $("#siteInfoForm").data('bootstrapValidator').isValid();
+TSiteInfo.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
 };
-
 
 /**
  * 清除数据
  */
-TSiteInfoDlg.clearData = function() {
-    this.tSiteInfoData = {};
+TSiteInfo.clearData = function() {
+    this.tCarInfoData = {};
 }
 
 /**
@@ -44,8 +30,8 @@
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-TSiteInfoDlg.set = function(key, val) {
-    this.tSiteInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+TSiteInfo.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
     return this;
 }
 
@@ -55,346 +41,353 @@
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-TSiteInfoDlg.get = function(key) {
+TSiteInfo.get = function(key) {
     return $("#" + key).val();
 }
 
+// 场地管理首页 选择对应的省市
+TSiteInfo.oneChange = function (e) {
+    var oneId=$(e).val();
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+    var selectedValue = e.value;
+    var citySelect = document.getElementById("cCode");
+    var accountSelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/getCity", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.city+"'>"+v.city+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    if (selectedValue === ""){
+        citySelect.innerHTML = '<option value="">请先选择省</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+    accountSelect.innerHTML = '<option value="">请先选择省/市</option>';
+    storeSelect.innerHTML = '<option value="">请先选择省/市</option>';
+    ajax.set("province",oneId);
+    ajax.start();
+};
+TSiteInfo.oneChangeNext = function (e) {
+    var selectedText = $('#cCode option:selected').text();
+    var startTime = document.getElementById('start-time');
+    var endTime = document.getElementById('end-time');
+
+    var citySelect = document.getElementById("account");
+    var storeSelect = document.getElementById("store");
+    var ajax = new $ax(Feng.ctxPath + "/tSite/accountChangeNext", function(data){
+        if(data!=null){
+            var content='<option value="">选择账号</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    if (selectedText === ""){
+        storeSelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        citySelect.innerHTML = '<option style="width: 300px" value="">请先选择省/市</option>';
+        startTime.disabled = true;
+        endTime.disabled = true;
+    }
+
+    ajax.set("oneId",selectedText);
+    ajax.start();
+
+    var ajax1 = new $ax(Feng.ctxPath + "/tSite/storeChangeNext", function(data){
+        if(data!=null && data.length !== 0){
+            var content='<option value="">选择门店</option>';
+            $.each(data, function(k,v) {
+                content += "<option style='width: 300px' value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#store").empty().append(content);
+        }else {
+            storeSelect.innerHTML = '<option value="">当前所选市没有门店</option>';
+        }
+    });
+    ajax1.set("oneId",selectedText);
+    ajax1.start();
+};
+TSiteInfo.getTime = function (e) {
+
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            var sTime = document.getElementById("start-time"); //获取输入的开始时间
+            var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+            var rStime = response.startTime; //门店的经营开始时间
+            var rEtime = response.endTime; //门店的经营结束时间
+
+            var sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            var sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+            console.log("门店经营开始时间")
+            console.log(sh)
+            console.log(sm)
+            rEtime = response.endTime;
+            var eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            var em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+            console.log("门店经营结束时间")
+            console.log(eh)
+            console.log(em)
+            sTime.addEventListener('change',function () {
+                var start = sTime.value;
+                var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+                var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+
+                if (Number(sh)>Number(startHour)){
+                    Feng.error("预约的开始时间不应小于营业开始时间!")
+                }else if(Number(sh) === Number(startHour) ){
+                    if (Number(sm)>Number(startMinute)){
+                        Feng.error("预约的开始时间不应大于营业开始时间!")
+                    }
+                }else if (Number(eh)<Number(startHour)){
+                    Feng.error("预约的开始时间不应大于营业结束时间!")
+                }else if(Number(eh)===Number(startHour)){
+                    Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                }
+            });
+            eTime.addEventListener('change',function () {
+                var end = eTime.value;
+                var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+                var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+                if (Number(eh)<Number(endHour)){
+                    Feng.error("预约的结束时间不应大于营业结束时间!")
+                }else if(Number(eh) === Number(endHour) ){
+                    if (Number(em)<Number(endMinute)){
+                        Feng.error("预约的开始时间不应大于开始营业时间!")
+                    }
+                }else if(Number(sh)>Number(endHour)){
+                    Feng.error("预约的结束时间不应小于营业开始时间!")
+                }
+            })
+
+        },
+        error: function (xhr, status, error) {
+            Feng.error("您的网络异常!");
+        }
+    });
+};
+function UploadFileFn(){
+    $('#upFile').click();
+}
+TSiteInfo.addSubmit = function(){
+    var data = {
+        id:null,
+        province:"",
+        city:"",
+        cityManagerId:"",
+        storeId:"",
+        siteTypeId:null,
+        appointmentStartTime:"",
+        appointmentEndTime:"",
+        cashPrice:null,
+        playPaiCoin:null,
+        insuranceEndTime:"",
+        name:"",
+        insuranceImg:"",
+        managementPlan:""
+    };
+    data.province            = $("#pCode").val()
+    data.id            = $("#id").val()
+    data.city                = $("#cCode").val()
+    data.cityManagerId       = $("#account").val()
+    data.storeId             = $("#store").val()
+    data.siteTypeId          = $("#siteTypeId").val()
+    data.appointmentStartTime= $("#start-time").val()
+    data.appointmentEndTime  = $("#end-time").val()
+    data.cashPrice           = $("#cashPrice").val()
+    data.playPaiCoin         = $("#playPaiCoin").val()
+    data.insuranceEndTime    = $("#insuranceEndTime").val()
+    data.name                = $("#name").val()
+    data.insuranceImg        = $("#img").val()
+    data.managementPlan      = $('#courseVideo').val()
+    var sh =data.appointmentStartTime.split(':')[0];
+    var sm =data.appointmentStartTime.split(':')[1];
+    var eh =data.appointmentEndTime.split(':')[0];
+    var em =data.appointmentEndTime.split(':')[1];
+
+    if($("#pCode").val()==''){
+        Feng.info("请选择省")
+        return;
+    }
+    if($("#cCode").val()==''){
+        Feng.info("请选择市")
+        return;
+    }
+    if($("#account").val()=='' ){
+        Feng.info("请选择账号")
+        return;
+    }
+    if($("#store").val()=='' ){
+        Feng.info("请选择门店")
+        return;
+    }
+    if($("#siteTypeId").val()=='' ){
+        Feng.info("请选择场地类型")
+        return;
+    }
+    if($("#name").val()==''){
+        Feng.info("请输入场地名称")
+        return;
+    }
+    if($("#start-time").val()=='' ){
+        Feng.info("请输入可预约时间段 开始时间")
+        return;
+    }
+    if($("#end-time").val()==''){
+        Feng.info("请输入可预约时间段 结束时间")
+        return;
+    }
+    if($("#cashPrice").val()==''){
+        Feng.info("请输入现金价格")
+        return;
+    }
+    if($("#playPaiCoin").val()==''){
+        Feng.info("请输入玩湃币价格")
+        return;
+    }
+    if($("#insuranceEndTime").val()==''){
+        Feng.info("请输入场地责任险有效期")
+        return;
+    }
+
+    // if($("#img").val()==''){
+    //     Feng.info("请上传场地责任有效期图片")
+    //     return;
+    // }
+    if($('#courseVideo').val()==''){
+        Feng.info("请上传消防及应急管理方案")
+        return;
+    }
+    var sTime = document.getElementById("start-time"); //获取输入的开始时间
+    var eTime  = document.getElementById("end-time"); // 获取输入的结束时间
+    var rStime = ""; //门店的经营开始时间
+    var rEtime = ""; //门店的经营结束时间
+    var selectedText = $('#store option:selected').text();
+    $.ajax({
+        url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+        type: "GET",
+        contentType: "application/json", // 设置请求头的 Content-Type
+        success: function (response) {
+            rStime = response.startTime;
+            sh = rStime.split(':')[0];// 门店经营开始时间:小时
+            sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+
+            rEtime = response.endTime;
+            eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+            em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+
+            var start = sTime.value;
+            var startHour = start.split(':')[0];  // 输入的可预约开始时间:小时
+            var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+            if (Number(sh)>Number(startHour)){
+                Feng.error("预约的开始时间不应小于营业开始时间!")
+                return false;
+            }else if(Number(sh) === Number(startHour) ){
+                if (Number(sm)>Number(startMinute)){
+                    Feng.error("预约的开始时间不应大于营业开始时间!")
+                    return false;
+                }
+            }else if (Number(eh)<Number(startHour)){
+                Feng.error("预约的开始时间不应大于营业结束时间!")
+                return false;
+            }else if(Number(eh)===Number(startHour)){
+                Feng.error("预约的开始时间不应大于等于营业结束时间!")
+                return false;
+            }
+            var end = eTime.value;
+            var endHour = end.split(':')[0];  // 输入的可预约结束时间:小时
+            var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+            if (Number(eh)<Number(endHour)){
+                Feng.error("预约的结束时间不应大于营业结束时间!")
+                return ;
+            }else if(Number(eh) === Number(endHour) ){
+                if (Number(em)<Number(endMinute)){
+                    Feng.error("预约的开始时间不应大于开始营业时间!")
+                    return ;
+                }
+            }else if(Number(sh)>Number(endHour)){
+                Feng.error("预约的结束时间不应小于营业开始时间!")
+                return ;
+            }
+            if (Number(endHour)===Number(sh)){
+                if(Number(endMinute) < Number(sm)){
+                    Feng.error("预约结束时间不应小于营业开始时间");
+                    return;
+                }
+            }
+            if (Number(startHour)===Number(endHour) && Number(startMinute)===Number(endMinute)){
+                Feng.error("至少预约半个小时");
+                return;
+            }
+            $.ajax({
+                url: Feng.ctxPath + "/tSite/updateSite" ,
+                type: "POST",
+                data: JSON.stringify(data),
+                contentType: "application/json",
+                success: function (response) {
+                    Feng.success("修改成功");
+                },
+                error: function (xhr, status, error) {
+                    Feng.error("修改失败!" + error);
+                }
+            });
+        },
+        error: function (xhr, status, error) {
+            var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+            Feng.error("您的网络异常!");
+            return false;
+        }
+    });
+
+};
 /**
  * 关闭此对话框
  */
-TSiteInfoDlg.close = function() {
+TSiteInfo.close = function() {
     parent.layer.close(window.parent.TSite.layerIndex);
 }
-
-/**
- * 收集数据
- */
-TSiteInfoDlg.collectData = function() {
-    this
-    .set('id')
-    .set('name')
-    .set('province')
-    .set('provinceCode')
-    .set('city')
-    .set('cityCode')
-    .set('district')
-    .set('districtCode')
-    .set('state')
-    .set('insertTime')
-    .set('insertUserId');
+function UploadFileFn(){
+    $('#upFile').click();
 }
+$(function () {
+    // 限制分钟选项为 0 和 30
+    var timeInputs = document.querySelectorAll('input[type="time"]');
+    timeInputs.forEach(function(input) {
+        input.addEventListener('change', function() {
+            var selectedTime = input.value;
+            var hour = selectedTime.split(':')[0];
+            var minute = selectedTime.split(':')[1];
+            if (minute < 30 &&minute>0) {
+                minute = '30';
+            } else if (minute >30) {
+                hour++;
+                minute = '00';
+                if (hour<10){
+                    hour = '0'+hour;
+                }
+            }
+            input.value = hour + ':' + minute;
 
-/**
- * 提交添加
- */
-TSiteInfoDlg.addSubmit = function() {
-
-    this.clearData();
-    this.collectData();
-    if(!this.validate()){
-        return ;
-    }
-    var name = $("#name").val();
-    var provinceCode = $("#provinceCode").val();
-    var cityCode = $("#cityCode").val();
-    var districtCode = $("#districtCode").val();
-    if ("" == provinceCode){
-        Feng.error("请选择所属城市");
-        return;
-    }
-    var subArr=[];
-    $(".areaValueClass").each(function () {
-        subArr.push({
-            id:$(this).find("input[name*='id']").val(),
-            areaType:$(this).find("input[name*='areaType1']").val(),
-            time:$(this).find("input[name*='time']").val(),
-            name:$(this).find("input[name*='name']").val(),
-            province:$(this).find("input[name*='province1']").val(),
-            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
-            city:$(this).find("input[name*='city1']").val(),
-            cityCode:$(this).find("input[name*='cityCode1']").val(),
-            district:$(this).find("input[name*='district1']").val(),
-            districtCode:$(this).find("input[name*='districtCode1']").val(),
-            coordinate:$(this).find("input[name*='coordinate1']").val(),
-        })
+        });
     });
-    if(subArr.length <= 0){
-        Feng.error("请至少填写一条站点区域");
-        return;
-    }
-    //提交信息
-    var ajax = new $ax(Feng.ctxPath + "/tSite/add", function(data){
-        if(data.status == 200){
-              Feng.success("添加成功!");
-            window.parent.TSite.table.refresh();
-            TSiteInfoDlg.close();
-        }else{
-            Feng.error(data.msg);
-        }
-    },function(data){
-        Feng.error("添加失败!" + data.responseJSON.message + "!");
-    });
-    ajax.set("name",name);
-    ajax.set("provinceCode",provinceCode);
-    ajax.set("province",$("#provinceCode option:selected").text());
-    if ("" != cityCode && null != cityCode && undefined != cityCode){
-        ajax.set("cityCode",cityCode);
-        ajax.set("city",$("#cityCode option:selected").text());
-    }
-    if ("" != districtCode && null != districtCode && undefined != districtCode){
-        ajax.set("districtCode",$("#districtCode").val());
-        ajax.set("district",$("#districtCode option:selected").text());
-    }
-    ajax.set("subArr",JSON.stringify(subArr));
-    ajax.start();
-}
+    Feng.initValidator("carInfoForm", TSiteInfo.validateFields);
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
 
-/**
- * 提交修改
- */
-TSiteInfoDlg.editSubmit = function() {
+    var carPhoto1 = new $WebUpload("url");
+    carPhoto1.setUploadBarId("progressBar");
+    carPhoto1.init();
+    TSiteInfo.getTime()
 
-    this.clearData();
-    this.collectData();
-    if(!this.validate()){
-        return ;
-    }
-    var name = $("#name").val();
-    var provinceCode = $("#provinceCode").val();
-    var cityCode = $("#cityCode").val();
-    var districtCode = $("#districtCode").val();
-    if ("" == provinceCode){
-        Feng.error("请选择所属城市");
-        return;
-    }
-    var subArr=[];
-    $(".areaValueClass").each(function () {
-        subArr.push({
-            id:$(this).find("input[name*='id']").val(),
-            areaType:$(this).find("input[name*='areaType1']").val(),
-            time:$(this).find("input[name*='time']").val(),
-            name:$(this).find("input[name*='name']").val(),
-            province:$(this).find("input[name*='province1']").val(),
-            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
-            city:$(this).find("input[name*='city1']").val(),
-            cityCode:$(this).find("input[name*='cityCode1']").val(),
-            district:$(this).find("input[name*='district1']").val(),
-            districtCode:$(this).find("input[name*='districtCode1']").val(),
-            coordinate:$(this).find("input[name*='coordinate1']").val(),
-        })
-    });
-    if(subArr.length <= 0){
-        Feng.error("请至少填写一条站点区域");
-        return;
-    }
-    //提交信息
-    var ajax = new $ax(Feng.ctxPath + "/tSite/update", function(data){
-        Feng.success("修改成功!");
-        window.parent.TSite.table.refresh();
-        TSiteInfoDlg.close();
-    },function(data){
-        Feng.error("修改失败!" + data.responseJSON.message + "!");
-    });
-    ajax.set("id",$("#id").val());
-    ajax.set("name",name);
-    ajax.set("provinceCode",provinceCode);
-    ajax.set("province",$("#provinceCode option:selected").text());
-    if ("" != cityCode && null != cityCode && undefined != cityCode){
-        ajax.set("cityCode",cityCode);
-        ajax.set("city",$("#cityCode option:selected").text());
-    }
-    if ("" != districtCode && null != districtCode && undefined != districtCode){
-        ajax.set("districtCode",$("#districtCode").val());
-        ajax.set("district",$("#districtCode option:selected").text());
-    }
-    ajax.set("subArr",JSON.stringify(subArr));
-    ajax.start();
-}
 
-$(function() {
-    Feng.initValidator("siteInfoForm", TSiteInfoDlg.validateFields);
 });
-
-
-//省改变
-TSiteInfoDlg.provinceChange = function (e) {
-    var provinceCode=$(e).val();
-    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
-        if(data!=null){
-            if(language==1){
-                var content='<option value="">选择市</option>';
-            }else if(language==2){
-                var content='<option value="">Please select a city</option>';
-            }else {
-                var content='<option value="">Pilih Kota</option>';
-            }
-            $.each(data, function(k,v) {
-                content += "<option value='"+v.code+"'>"+v.name+"</option>";
-            });
-            $("#cityCode").empty().append(content);
-            $("#districtCode").empty().append('<option value="">选择区</option>');
-        }
-    });
-    ajax.set("code",provinceCode);
-    ajax.start();
-}
-//市改变
-TSiteInfoDlg.cityChange = function (e) {
-    var cityCode=$(e).val();
-    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
-        if(data!=null){
-            if(language==1){
-                var content='<option value="">选择区</option>';
-            }else if(language==2){
-                var content='<option value="">Please select a city</option>';
-            }else {
-                var content='<option value="">Pilih Kota</option>';
-            }
-            $.each(data, function(k,v) {
-                content += "<option value='"+v.code+"'>"+v.name+"</option>";
-            });
-            $("#districtCode").empty().append(content);
-        }
-    });
-    ajax.set("code",cityCode);
-    ajax.start();
-}
-/**
- * 类型改变执行
- * @param e
- */
-TSiteInfoDlg.areaTypeClick = function (e) {
-    if (1 == e){//行政区域
-        $("#areaType1Div").show();
-        $("#areaType2Div").hide();
-    } else if (2 == e){
-        $("#areaType2Div").show();
-        $("#areaType1Div").hide();
-    }
-}
-
-//站点区域省改变
-TSiteInfoDlg.provinceChange1 = function (e) {
-    var provinceCode=$(e).val();
-    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
-        if(data!=null){
-            if(language==1){
-                var content='<option value="">选择市</option>';
-            }else if(language==2){
-                var content='<option value="">Please select a city</option>';
-            }else {
-                var content='<option value="">Pilih Kota</option>';
-            }
-            $.each(data, function(k,v) {
-                content += "<option value='"+v.code+"'>"+v.name+"</option>";
-            });
-            $("#cityCode1").empty().append(content);
-            $("#districtCode1").empty().append('<option value="">选择区</option>');
-        }
-    });
-    ajax.set("code",provinceCode);
-    ajax.start();
-}
-//站点区域市改变
-TSiteInfoDlg.cityChange1 = function (e) {
-    var cityCode=$(e).val();
-    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
-        if(data!=null){
-            if(language==1){
-                var content='<option value="">选择区</option>';
-            }else if(language==2){
-                var content='<option value="">Please select a city</option>';
-            }else {
-                var content='<option value="">Pilih Kota</option>';
-            }
-            $.each(data, function(k,v) {
-                content += "<option value='"+v.code+"'>"+v.name+"</option>";
-            });
-            $("#districtCode1").empty().append(content);
-        }
-    });
-    ajax.set("code",cityCode);
-    ajax.start();
-}
-
-/**
- * 添加区域
- */
-TSiteInfoDlg.addArea = function () {
-    var areaName = $("#areaName").val();
-    if ("" == areaName || null == areaName){
-        Feng.error("区域名称不能为空");
-        return;
-    }
-    var areaType = $("input[name='areaType']:checked").val();
-    var b = false;
-    $(".areaValueClass").each(function () {
-        var areaType1 = $(this).find("input[name*='areaType1']").val();
-        if(areaType != areaType1){
-            b = true;
-            return
-        }
-    });
-    if(b){
-        Feng.error("电子围栏和行政区域不能混合使用");
-        return;
-    }
-
-    if (1 == areaType){
-        var provinceCode1 = $("#provinceCode1").val();
-        var province1 = $("#provinceCode1 option:selected").text();
-        var cityCode1 = $("#cityCode1").val();
-        var city1 = $("#cityCode1 option:selected").text();
-        var districtCode1 = $("#districtCode1").val();
-        var district1 = $("#districtCode1 option:selected").text();
-        if ("" == provinceCode1){
-            Feng.error("请选择行政区域所属省");
-            return;
-        }
-    }else if (2 == areaType) {
-        if("" == coordinate){
-            Feng.error('请在地图上规划区域');
-            return;
-        }
-    }
-    var subArr=[];
-    $(".areaValueClass").each(function () {
-        subArr.push({
-            areaType:$(this).find("input[name*='areaType1']").val(),
-            time:$(this).find("input[name*='time']").val(),
-            name:$(this).find("input[name*='name']").val(),
-            province:$(this).find("input[name*='province1']").val(),
-            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
-            city:$(this).find("input[name*='city1']").val(),
-            cityCode:$(this).find("input[name*='cityCode1']").val(),
-            district:$(this).find("input[name*='district1']").val(),
-            districtCode:$(this).find("input[name*='districtCode1']").val(),
-            coordinate:$(this).find("input[name*='coordinate1']").val(),
-        })
-    });
-    var str = '<tr class="areaValueClass">' +
-        // '<td>' + (subArr.length+1) + '</td>' +
-        '<td style="text-align: center;">' +
-        '<input type="hidden" id="areaType1" name="areaType1" value="'+areaType+'">' +
-        '<input type="hidden" id="time" name="time" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
-
-        '<td style="text-align: center;">' +
-        '<input type="hidden" id="name" name="name" value="'+areaName+'">' +
-        '<input type="hidden" id="provinceCode1" name="provinceCode1" value="'+provinceCode1+'">' +
-        '<input type="hidden" id="province1" name="province1" value="'+province1+'">' +
-        '<input type="hidden" id="cityCode1" name="cityCode1" value="'+cityCode1+'">' +
-        '<input type="hidden" id="city1" name="city1" value="'+city1+'">' +
-        '<input type="hidden" id="districtCode1" name="districtCode1" value="'+districtCode1+'">' +
-        '<input type="hidden" id="district1" name="district1" value="'+district1+'">' +
-        '<input type="hidden" id="coordinate1" name="coordinate1" value="'+coordinate+'">' + areaName + '</td>' +
-
-        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
-    $("#areaValue").append(str);
-
-    //清除电子围栏数据
-    $("#clear").click();
-}
-//删除数据
-function deleteSub(e) {
-    $(e).parent().parent().remove();
-}
\ No newline at end of file
diff --git a/cloud-server-other/pom.xml b/cloud-server-other/pom.xml
index ce2069a..a516f3c 100644
--- a/cloud-server-other/pom.xml
+++ b/cloud-server-other/pom.xml
@@ -6,7 +6,7 @@
         <groupId>cn.mb.cloud</groupId>
         <artifactId>mb-cloud-parent</artifactId>
         <version>1.1.3</version>
-        <relativePath>../cloud-server-parent/pom.xml</relativePath>
+        <relativePath>../../cloud-server-parent/pom.xml</relativePath>
     </parent>
     <artifactId>mb-cloud-other</artifactId>
     <packaging>jar</packaging>
@@ -122,10 +122,6 @@
                 </executions>
             </plugin>
 
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
     <repositories>
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
index f05c175..d701c3b 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
@@ -1,15 +1,24 @@
 package com.dsh.other.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.other.entity.Site;
 import com.dsh.other.entity.SiteBooking;
 import com.dsh.other.entity.SiteType;
+import com.dsh.other.entity.TSite;
+import com.dsh.other.feignclient.account.CityManagerClient;
+import com.dsh.other.feignclient.account.model.CityManager;
 import com.dsh.other.feignclient.activity.UserCouponClient;
 import com.dsh.other.feignclient.activity.model.QueryUserCouponByIdAndUserId;
 import com.dsh.other.feignclient.activity.model.UserCoupon;
 import com.dsh.other.feignclient.model.BillingDataRequestVo;
+import com.dsh.other.feignclient.model.SiteChangeStateVO;
 import com.dsh.other.feignclient.model.SiteVo;
 import com.dsh.other.model.*;
+import com.dsh.other.model.dto.siteDto.TSiteDTO;
+import com.dsh.other.model.vo.questionVo.QuestionChangeStateVO;
+import com.dsh.other.model.vo.siteVo.ExpireSiteSearchVO;
+import com.dsh.other.model.vo.siteVo.SiteSearchVO;
 import com.dsh.other.service.ISiteBookingService;
 import com.dsh.other.service.ISiteService;
 import com.dsh.other.service.ISiteTypeService;
@@ -19,6 +28,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -56,9 +66,52 @@
 
     @Resource
     private UserCouponClient userCouponClient;
+    @Autowired
+    private CityManagerClient cityManagerClient;
 
 
+    /**
+     * 获取所有场地
+     * @return
+     */
+    @RequestMapping("/base/site/list")
+    public List<TSiteDTO> listAll(@RequestBody SiteSearchVO vo){
 
+        return siteTypeService.listAll(vo);
+
+    }
+    /**
+     * 获取场地有效期在两个月内的场地列表
+     * @return
+     */
+    @RequestMapping("/base/site/listExipre")
+    public List<TSiteDTO> listExipre(@RequestBody ExpireSiteSearchVO vo){
+
+        return siteTypeService.listExipre(vo);
+
+    }
+
+    /**
+     * 上/下架、删除常见问题 type=1为上架 2为下架 3为删除
+     */
+    @RequestMapping("/base/site/changeState")
+    public Object changeState(@RequestBody SiteChangeStateVO vo){
+
+        return siteService.changeState(vo);
+    }
+    /**
+     * 添加场地管理
+     * @return
+     */
+    @RequestMapping("/base/site/addSite")
+    public Object addSite(@RequestBody Site site){
+        if(site.getId()!= null ){
+
+            return siteService.updateById(site);
+        }else {
+            return siteService.save(site);
+        }
+    }
 
     @ResponseBody
     @PostMapping("/base/site/querySiteType")
@@ -168,10 +221,6 @@
             return ResultUtil.runErr();
         }
     }
-
-
-
-
 
     /**
      * 购买课程微信支付回调
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java
new file mode 100644
index 0000000..5ad9f9d
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java
@@ -0,0 +1,103 @@
+package com.dsh.other.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.other.entity.Site;
+import com.dsh.other.entity.SiteBooking;
+import com.dsh.other.entity.SiteLock;
+import com.dsh.other.entity.SiteType;
+import com.dsh.other.feignclient.activity.UserCouponClient;
+import com.dsh.other.feignclient.activity.model.QueryUserCouponByIdAndUserId;
+import com.dsh.other.feignclient.activity.model.UserCoupon;
+import com.dsh.other.feignclient.model.BillingDataRequestVo;
+import com.dsh.other.feignclient.model.SiteChangeStateVO;
+import com.dsh.other.feignclient.model.SiteVo;
+import com.dsh.other.model.*;
+import com.dsh.other.model.dto.siteDto.TSiteDTO;
+import com.dsh.other.model.dto.siteDto.TSiteLockDTO;
+import com.dsh.other.model.vo.siteVo.SiteSearchVO;
+import com.dsh.other.service.ISiteBookingService;
+import com.dsh.other.service.ISiteLockService;
+import com.dsh.other.service.ISiteService;
+import com.dsh.other.service.ISiteTypeService;
+import com.dsh.other.util.PayMoneyUtil;
+import com.dsh.other.util.ResultUtil;
+import com.dsh.other.util.TokenUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/13 16:50
+ */
+@RestController
+@RequestMapping("")
+public class SiteLockController {
+
+    @Autowired
+    private ISiteService siteService;
+    @Autowired
+    private ISiteLockService siteLockService;
+
+    /**
+     * 锁定场地列表
+     * @param
+     * @return
+     */
+
+    @PostMapping("/siteLock/getListById/{id}")
+    public List<TSiteLockDTO> getListById(@PathVariable("id") Integer id){
+       return siteLockService.getListById(id);
+    }
+
+    /**
+     * 添加锁定场地
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/siteLock/addSiteLock")
+    public Object addSiteLock(@RequestBody TSiteLockDTO siteLock){
+        SiteLock siteLock1 = new SiteLock();
+        BeanUtils.copyProperties(siteLock,siteLock1);
+        siteLockService.save(siteLock1);
+        return siteLock1.getId();
+    }
+
+    /**
+     * 删除锁定场地
+     * @param
+     * @return
+     */
+    @PostMapping("/siteLock/deleteSiteLock/{id}")
+    public Object deleteSiteLock(@PathVariable("id") Integer id){
+        return siteLockService.removeById(id);
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
index 5290264..f1c96eb 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
@@ -30,6 +30,46 @@
     private GDMapGeocodingUtil gdMapGeocodingUtil;
 
 
+    /**
+     * 根据城市管理员id获取门店
+     */
+    @RequestMapping("base/site/getStoreByCityManagerId")
+    public Object getStoreByCityManagerId(@RequestBody Integer id){
+        return storeService.getStoreByCityManagerId(id);
+    }
+    /**
+     * 根据员工id获取门店
+     */
+    @RequestMapping("base/site/getStoreByStoreStaffId")
+    public Object getStoreByStoreStaffId(@RequestBody Integer id){
+        return storeService.getStoreByStoreStaffId(id);
+    }
+
+    /**
+     * 根据门店id获取门店信息
+     */
+    @RequestMapping("base/site/getStoreById")
+    public Store getStoreById(@RequestBody Integer id){
+        return storeService.getOne(new QueryWrapper<Store>().eq("id",id));
+    }
+    /**
+     * 选择市区 展示全部门店
+     */
+    @RequestMapping("base/store/getStore")
+    public List<Store> getStore(@RequestBody String city){
+        return storeService.list(new QueryWrapper<Store>().eq("city",city));
+    }
+
+    /**
+     * 根据所选门店 查询经营时间
+     * @param oneId
+     * @return
+     */
+    @RequestMapping("base/store/getTime")
+    public Store getTime(@RequestBody String oneId){
+        return storeService.getOne(new QueryWrapper<Store>().eq("name",oneId));
+    }
+
 
 
     @PostMapping("/base/protocol/storeDetail/courseOfSto")
@@ -168,7 +208,7 @@
      */
     @ResponseBody
     @PostMapping("/store/queryStoreByIds")
-    public List<Store> queryStoreByIds(List<Integer> ids){
+    public List<Store> queryStoreByIds(@RequestBody List<Integer> ids){
         try {
             return storeService.list(new LambdaQueryWrapper<Store>()
                     .in(Store::getId,ids));
diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java b/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
index 6d9a773..877477b 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -84,6 +85,7 @@
      * 场地责任险有效期
      */
     @TableField("insuranceEndTime")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date insuranceEndTime;
     /**
      * 场地责任险图片
@@ -104,6 +106,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date insertTime;
 
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java b/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java
index d938c1d..bd6cdee 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -29,10 +30,12 @@
      * 锁定开始时间
      */
     @TableField("startTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date startTime;
     /**
      * 锁定结束时间
      */
     @TableField("endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date endTime;
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java b/cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java
new file mode 100644
index 0000000..97a9541
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java
@@ -0,0 +1,111 @@
+package com.dsh.other.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:43
+ */
+@Data
+@TableName("t_site")
+public class TSite {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店id
+     */
+    @TableField("storeId")
+    private Integer storeId;
+    /**
+     * 场地名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 场地类型id
+     */
+    @TableField("siteTypeId")
+    private Integer siteTypeId;
+    /**
+     * 城市管理员id
+     */
+    @TableField("cityManagerId")
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    @TableField("appointmentStartTime")
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    @TableField("appointmentEndTime")
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    @TableField("cashPrice")
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    @TableField("playPaiCoin")
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    @TableField("insuranceEndTime")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    @TableField("insuranceImg")
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    @TableField("managementPlan")
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date insertTime;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java
new file mode 100644
index 0000000..a26b7e1
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java
@@ -0,0 +1,45 @@
+package com.dsh.other.feignclient.account;
+
+import com.dsh.other.feignclient.account.model.CityManager;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:07
+ */
+@FeignClient("mb-cloud-account")
+public interface CityManagerClient {
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @PostMapping("/cityManager/queryCityManagerById")
+    CityManager queryCityManagerById(Integer id);
+
+    /**
+     * 获取已有城市管理的省、市
+     */
+    @RequestMapping("/cityManager/listAll")
+    List<CityManager> listAll();
+
+    /**
+     * 选择省 展示市
+     */
+    @RequestMapping("/cityManager/getCity")
+    List<CityManager> getCity(@RequestBody String province);
+
+    /**
+     * 选择市区 展示全部账号
+     */
+    @RequestMapping("/cityManager/getAccount")
+    List<CityManager> getAccount(@RequestBody String city);
+
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java
new file mode 100644
index 0000000..b7689ac
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java
@@ -0,0 +1,56 @@
+package com.dsh.other.feignclient.account.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:00
+ */
+@Data
+@TableName("t_city_manager")
+public class CityManager {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 姓名
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 电话
+     */
+    @TableField("phone")
+    private String phone;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java
new file mode 100644
index 0000000..1cfee2c
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java
@@ -0,0 +1,91 @@
+package com.dsh.other.feignclient.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 17:43
+ */
+@Data
+public class SiteAddDTO {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 场地类型id
+     */
+    private Integer siteTypeId;
+    /**
+     * 城市管理员id
+     */
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date insertTime;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java
new file mode 100644
index 0000000..ba5279e
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java
@@ -0,0 +1,21 @@
+package com.dsh.other.feignclient.model;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 修改场地状态
+ */
+@Data
+public class SiteChangeStateVO {
+    /**
+     * 场地Id
+     */
+    List<Integer> siteIds;
+    /**
+     * 上/下架 删除场地 type=1 上架 2下架 3删除
+     */
+    Integer type;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java
index 3780f34..43a58d6 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java
@@ -2,10 +2,15 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dsh.other.entity.SiteLock;
+import com.dsh.other.model.dto.siteDto.TSiteLockDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @Date 2023/7/18 14:43
  */
 public interface SiteLockMapper extends BaseMapper<SiteLock> {
+    List<TSiteLockDTO> getListById(@Param("id") Integer id);
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
index ff47827..2824a2f 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
@@ -5,8 +5,12 @@
 import com.dsh.other.model.QueryMySiteVo;
 import com.dsh.other.model.QuerySiteList;
 import com.dsh.other.model.QuerySiteListVo;
+import com.dsh.other.model.dto.siteDto.TSiteDTO;
+import com.dsh.other.model.vo.siteVo.ExpireSiteSearchVO;
+import com.dsh.other.model.vo.siteVo.SiteSearchVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -34,4 +38,12 @@
      */
     List<QueryMySiteVo> queryMySite(@Param("uid") Integer uid, @Param("status") Integer status,
                                     @Param("pageNo") Integer pageNo, @Param("pageSize") Integer pageSize);
+
+    List<TSiteDTO> listAll(@Param("query") SiteSearchVO vo);
+
+
+    Object changeState(@Param("siteIds") List<Integer> siteIds, @Param("type")Integer type);
+
+    List<TSiteDTO> listExipre(@Param("query") ExpireSiteSearchVO vo);
+
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java
index 8c9579f..0bacdc4 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java
@@ -5,6 +5,7 @@
 import com.dsh.other.model.BaseVo;
 import com.dsh.other.model.ProvinceAndCityVo;
 import org.apache.ibatis.annotations.Param;
+import org.aspectj.lang.annotation.DeclareParents;
 
 import java.util.List;
 
@@ -42,4 +43,16 @@
      */
     List<BaseVo> queryStoreByCityCode(@Param("cityCode") String cityCode);
 
+    /**
+     * 根据城市管理员id获取门店集合
+     * @param id
+     * @return
+     */
+    List<Store> getStoreByCityManagerId(@Param("id") Integer id);
+    /**
+     * 根据门店员工id获取门店集合
+     * @param id
+     * @return
+     */
+    List<Store> getStoreByStoreStaffId(@Param("id") Integer id);
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java
new file mode 100644
index 0000000..1d01f40
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java
@@ -0,0 +1,97 @@
+package com.dsh.other.model.dto.siteDto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 场地管理列表DTO
+ * @Date 2023/8/1 17:43
+ */
+@Data
+public class TSiteDTO {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 门店名称
+     */
+    private String storeName;
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 场地类型id
+     */
+    private Integer siteTypeId;
+    /**
+     * 场地类型名称
+     */
+    private String siteTypeName;
+    /**
+     * 城市管理员id
+     */
+    private Integer cityManagerId;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 预约开始时间
+     */
+    private String appointmentStartTime;
+    /**
+     * 预约结束时间
+     */
+    private String appointmentEndTime;
+    /**
+     * 现金价格(x/半小时)
+     */
+    private Double cashPrice;
+    /**
+     * 玩湃币价格(x/半小时)
+     */
+    private Integer playPaiCoin;
+    /**
+     * 场地责任险有效期
+     */
+    private Date insuranceEndTime;
+    /**
+     * 场地责任险图片
+     */
+    private String insuranceImg;
+    /**
+     * 消防应急管理方案
+     */
+    private String managementPlan;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java
new file mode 100644
index 0000000..e5e67cc
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java
@@ -0,0 +1,39 @@
+package com.dsh.other.model.dto.siteDto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 锁定场地DTO
+ */
+@Data
+public class TSiteLockDTO {
+    /**
+     * 场地id
+     */
+    private Integer id;
+    /**
+     * 场地id
+     */
+    private Integer siteId;
+    /**
+     * 锁定开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date startTime;
+    /**
+     * 锁定结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date endTime;
+
+    private String ssTime;
+
+    private String eeTime;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java b/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java
new file mode 100644
index 0000000..99a28e9
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java
@@ -0,0 +1,40 @@
+package com.dsh.other.model.vo.siteVo;
+
+import lombok.Data;
+
+@Data
+public class ExpireSiteSearchVO {
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 场地类型
+     */
+    private Integer siteTypeId;
+
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 对象类型(1=平台,2=城市管理员,3=门店)
+     */
+    private Integer objectType;
+
+    private Integer objectId;
+
+    // 登陆人类型
+    private Integer typeId ;
+
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java b/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java
new file mode 100644
index 0000000..c5b2cf7
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java
@@ -0,0 +1,36 @@
+package com.dsh.other.model.vo.siteVo;
+
+import lombok.Data;
+
+@Data
+public class SiteSearchVO {
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 场地类型
+     */
+    private Integer siteTypeId;
+
+    /**
+     * 场地名称
+     */
+    private String name;
+    /**
+     * 对象类型(1=平台,2=城市管理员,3=门店)
+     */
+    private Integer objectType;
+
+    private Integer objectId;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java
index 7a0afde..853b66a 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java
@@ -2,10 +2,16 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.other.entity.SiteLock;
+import com.dsh.other.model.dto.siteDto.TSiteLockDTO;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @Date 2023/7/18 14:44
  */
 public interface ISiteLockService extends IService<SiteLock> {
+    List<TSiteLockDTO> getListById(Integer id);
+
+
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
index 35db539..7c7cefd 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.other.entity.Site;
+import com.dsh.other.feignclient.model.SiteChangeStateVO;
 import com.dsh.other.model.*;
 import com.dsh.other.util.ResultUtil;
 
@@ -89,4 +90,7 @@
      * @throws Exception
      */
     ResultUtil<Map<String, Double>> queryContinuePaymentMySitePrice(Integer id) throws Exception;
+
+    Object changeState(SiteChangeStateVO vo);
+
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java
index 6560fd3..a5f75bb 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.other.entity.SiteType;
 import com.dsh.other.model.BaseVo;
+import com.dsh.other.model.dto.siteDto.TSiteDTO;
+import com.dsh.other.model.vo.siteVo.ExpireSiteSearchVO;
+import com.dsh.other.model.vo.siteVo.SiteSearchVO;
 
 import java.util.List;
 
@@ -19,4 +22,8 @@
      * @throws Exception
      */
     List<BaseVo> querySiteType() throws Exception;
+
+    List<TSiteDTO> listAll(SiteSearchVO vo);
+
+    List<TSiteDTO> listExipre(ExpireSiteSearchVO vo);
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java b/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java
index 068bebd..92a2931 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java
@@ -64,4 +64,7 @@
      */
     List<BaseVo> queryStoreByCityCode(String cityCode) throws Exception;
 
+    List<Store> getStoreByCityManagerId(Integer id);
+
+    List<Store> getStoreByStoreStaffId(Integer id);
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java
index f0d0a85..7eb29aa 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java
@@ -3,8 +3,12 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.other.entity.SiteLock;
 import com.dsh.other.mapper.SiteLockMapper;
+import com.dsh.other.model.dto.siteDto.TSiteLockDTO;
 import com.dsh.other.service.ISiteLockService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
@@ -12,4 +16,11 @@
  */
 @Service
 public class SiteLockServiceImpl extends ServiceImpl<SiteLockMapper, SiteLock> implements ISiteLockService {
+    @Autowired
+    private SiteLockMapper siteLockMapper;
+    @Override
+    public List<TSiteLockDTO> getListById(Integer id) {
+        return siteLockMapper.getListById(id);
+    }
+
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
index 75a7ffd..98459ce 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
@@ -13,10 +13,13 @@
 import com.dsh.other.feignclient.activity.model.Coupon;
 import com.dsh.other.feignclient.activity.model.QueryUserCouponByIdAndUserId;
 import com.dsh.other.feignclient.activity.model.UserCoupon;
+import com.dsh.other.feignclient.model.SiteChangeStateVO;
 import com.dsh.other.mapper.SiteMapper;
 import com.dsh.other.model.*;
 import com.dsh.other.service.*;
 import com.dsh.other.util.*;
+import io.swagger.models.auth.In;
+import org.aspectj.weaver.ast.Var;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -56,6 +59,8 @@
 
     @Autowired
     private PayMoneyUtil payMoneyUtil;
+    @Autowired
+    private SiteMapper siteMapper;
 
 
 
@@ -627,4 +632,13 @@
         map.put("cash", payMoney);
         return ResultUtil.success(map);
     }
+
+    @Override
+    public Object changeState(SiteChangeStateVO vo) {
+
+        List<Integer> siteIds = vo.getSiteIds();
+        Integer type = vo.getType();
+        return siteMapper.changeState(siteIds,type);
+
+    }
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java
index 1d059c2..e656661 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java
@@ -3,12 +3,17 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.other.entity.SiteType;
+import com.dsh.other.mapper.SiteMapper;
 import com.dsh.other.mapper.SiteTypeMapper;
 import com.dsh.other.model.BaseVo;
+import com.dsh.other.model.dto.siteDto.TSiteDTO;
+import com.dsh.other.model.vo.siteVo.ExpireSiteSearchVO;
+import com.dsh.other.model.vo.siteVo.SiteSearchVO;
 import com.dsh.other.service.ISiteTypeService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -19,6 +24,8 @@
 @Service
 public class SiteTypeServiceImpl extends ServiceImpl<SiteTypeMapper, SiteType> implements ISiteTypeService {
 
+    @Resource
+    private SiteMapper siteMapper;
 
     /**
      * 获取场地分类
@@ -36,4 +43,16 @@
         }
         return list;
     }
+
+    @Override
+    public List<TSiteDTO> listAll(SiteSearchVO vo) {
+        return siteMapper.listAll(vo);
+    }
+
+    @Override
+    public List<TSiteDTO> listExipre(ExpireSiteSearchVO vo) {
+
+
+       return siteMapper.listExipre(vo);
+    }
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java
index a450214..d19338e 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java
@@ -30,7 +30,29 @@
 public class StoreServiceImpl extends ServiceImpl<StoreMapper,Store> implements StoreService {
 
     @Autowired
+    private StoreMapper storeMapper;
+    @Autowired
     private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+
+    /**
+     * 根据城市管理员id获取门店集合
+     * @param id
+     * @return
+     */
+    @Override
+    public List<Store> getStoreByCityManagerId(Integer id) {
+        return storeMapper.getStoreByCityManagerId(id);
+    }
+    /**
+     * 根据门店员工id获取门店集合
+     * @param id
+     * @return
+     */
+    @Override
+    public List<Store> getStoreByStoreStaffId(Integer id) {
+        return storeMapper.getStoreByStoreStaffId(id);
+    }
 
 
     /**
@@ -121,4 +143,6 @@
     public List<BaseVo> queryStoreByCityCode(String cityCode) throws Exception {
         return this.baseMapper.queryStoreByCityCode(cityCode);
     }
+
+
 }
diff --git a/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml b/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml
index 3b18446..2a736a2 100644
--- a/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml
+++ b/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml
@@ -3,4 +3,9 @@
 <mapper namespace="com.dsh.other.mapper.SiteLockMapper">
 
 
+    <select id="getListById" resultType="com.dsh.other.model.dto.siteDto.TSiteLockDTO">
+        select * from t_site_lock
+        where siteId = #{id}
+        and endTime > NOW()
+    </select>
 </mapper>
diff --git a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
index 592245c..87454da 100644
--- a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
+++ b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
@@ -1,7 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.dsh.other.mapper.SiteMapper">
-
+    <update id="changeState">
+        update t_site set
+        state = #{type}
+        <where>
+            <if test="siteIds != null and siteIds.size()>0">
+                AND t_site.id IN
+                <foreach collection="siteIds" separator="," item="id" open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </update>
 
     <select id="querySiteList" resultType="com.dsh.other.model.QuerySiteListVo">
         select
@@ -61,4 +72,63 @@
         </if>
         order by a.insertTime desc limit #{pageNo}, #{pageSize}
     </select>
+    <select id="listAll" resultType="com.dsh.other.model.dto.siteDto.TSiteDTO">
+        select t1.*,t2.name storeName,t3.name siteTypeName from t_site t1
+        inner join t_store t2 on t1.storeId = t2.id
+        left join t_site_type t3 on t1.siteTypeId = t3.id
+        <where>
+        <if test="query.objectType == 2">
+        and t1.cityManagerId = #{query.objectId}
+        </if>
+        <if test="query.objectType == 3">
+        and t2.storeStaffId = #{query.objectId}
+        </if>
+            <if test="query.city!=null and query.city!= ''">
+                and t1.city = #{query.city}
+            </if>
+        <if test="query.province!=null and query.province!= ''">
+            and t1.province = #{query.province}
+        </if>
+        <if test="query.siteTypeId!=null and query.siteTypeId!= ''">
+            and t1.siteTypeId = #{query.siteTypeId}
+        </if>
+        <if test="query.storeName!=null and query.storeName!= ''">
+            and t2.name like concat('%',#{query.storeName},'%')
+        </if>
+        <if test="query.name!=null and query.name!= ''">
+            and t1.name like concat('%',#{query.name},'%')
+        </if>
+        and t1.state != 3
+        </where>
+    </select>
+    <select id="listExipre" resultType="com.dsh.other.model.dto.siteDto.TSiteDTO">
+        select t1.*,t2.name storeName,t3.name siteTypeName from t_site t1
+        inner join t_store t2 on t1.storeId = t2.id
+        left join t_site_type t3 on t1.siteTypeId = t3.id
+        <where>
+            <if test="query.objectType == 2">
+                and t1.cityManagerId = #{query.objectId}
+            </if>
+            <if test="query.objectType == 3">
+                and t2.storeStaffId = #{query.objectId}
+            </if>
+            <if test="query.city!=null and query.city!= ''">
+                and t1.city = #{query.city}
+            </if>
+            <if test="query.province!=null and query.province!= ''">
+                and t1.province = #{query.province}
+            </if>
+            <if test="query.siteTypeId!=null and query.siteTypeId!= ''">
+                and t1.siteTypeId = #{query.siteTypeId}
+            </if>
+            <if test="query.storeName!=null and query.storeName!= ''">
+                and t2.name like concat('%',#{query.storeName},'%')
+            </if>
+            <if test="query.name!=null and query.name!= ''">
+                and t1.name like concat('%',#{query.name},'%')
+            </if>
+            and t1.state != 3
+            and t1.insuranceEndTime &lt;= DATE_ADD(CURDATE(), INTERVAL 2 MONTH);
+        </where>
+    </select>
 </mapper>
diff --git a/cloud-server-other/src/main/resources/mapper/StoreMapper.xml b/cloud-server-other/src/main/resources/mapper/StoreMapper.xml
index 244a264..01bb524 100644
--- a/cloud-server-other/src/main/resources/mapper/StoreMapper.xml
+++ b/cloud-server-other/src/main/resources/mapper/StoreMapper.xml
@@ -19,4 +19,10 @@
     <select id="queryStoreByCityCode" resultType="com.dsh.other.model.BaseVo">
         select id, name from t_store where state = 1 and cityCode = #{cityCode}
     </select>
+    <select id="getStoreByCityManagerId" resultType="com.dsh.other.entity.Store">
+        select * from t_store where cityManagerId = #{id}
+    </select>
+    <select id="getStoreByStoreStaffId" resultType="com.dsh.other.entity.Store">
+        select * from t_store where storeStaffId = #{id}
+    </select>
 </mapper>

--
Gitblit v1.7.1