Browse Source

小幅度修复

PrettyCat1 10 months ago
parent
commit
cca4a85ad3
57 changed files with 3238 additions and 538 deletions
  1. 13 0
      .idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml
  2. 13 0
      .idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml
  3. 13 0
      .idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml
  4. 13 0
      .idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml
  5. 13 0
      .idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml
  6. 13 0
      .idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml
  7. 13 0
      .idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml
  8. 13 0
      .idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml
  9. 13 0
      .idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml
  10. 13 0
      .idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml
  11. 13 0
      .idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml
  12. 13 0
      .idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml
  13. 13 0
      .idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml
  14. 13 0
      .idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml
  15. 13 0
      .idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml
  16. 13 0
      .idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_2.xml
  17. 13 0
      .idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml
  18. 13 0
      .idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml
  19. 13 0
      .idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml
  20. 13 0
      .idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml
  21. 13 0
      .idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml
  22. 24 3
      java.iml
  23. 22 0
      java/pom.xml
  24. 1 0
      java/src/main/java/boot/BootApplication.java
  25. 0 1
      java/src/main/java/boot/modules/manage/controller/ManageController.java
  26. 0 1
      java/src/main/java/boot/modules/user/controller/UserController.java
  27. 893 143
      java/target/classes/META-INF/spring-configuration-metadata.json
  28. BIN
      java/target/classes/boot/BootApplication.class
  29. BIN
      java/target/classes/boot/modules/manage/controller/ManageController.class
  30. BIN
      java/target/classes/boot/modules/user/controller/UserController.class
  31. 1 1
      vue_project/src/App.vue
  32. 5 0
      vue_project/src/api/index.js
  33. 227 0
      vue_project/src/assets/css/home.css
  34. 124 0
      vue_project/src/assets/css/iconfont.css
  35. 0 0
      vue_project/src/assets/css/iconfont.js
  36. 198 0
      vue_project/src/assets/css/iconfont.json
  37. 54 0
      vue_project/src/assets/css/iconfont.svg
  38. BIN
      vue_project/src/assets/css/iconfont.ttf
  39. BIN
      vue_project/src/assets/css/iconfont.woff
  40. BIN
      vue_project/src/assets/css/iconfont.woff2
  41. BIN
      vue_project/src/assets/images/华为.png
  42. BIN
      vue_project/src/assets/images/抖音.png
  43. BIN
      vue_project/src/assets/images/新浪微博.png
  44. BIN
      vue_project/src/assets/images/淘宝.png
  45. BIN
      vue_project/src/assets/images/阿里云.png
  46. 281 3
      vue_project/src/components/LoginForm.vue
  47. 9 3
      vue_project/src/components/RegisterForm.vue
  48. 0 50
      vue_project/src/components/demo.vue
  49. 236 131
      vue_project/src/components/footer.vue
  50. 31 33
      vue_project/src/components/home.vue
  51. 0 3
      vue_project/src/components/index.vue
  52. 774 129
      vue_project/src/components/indexBody.vue
  53. 48 10
      vue_project/src/components/indexHeader.vue
  54. 20 16
      vue_project/src/components/indexNav.vue
  55. 10 1
      vue_project/src/router/index.js
  56. 0 7
      vue_project/src/router/router.js
  57. 7 3
      vue_project/src/utils/request.js

+ 13 - 0
.idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.fasterxml:classmate:1.5.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/com/fasterxml/classmate/1.5.1/classmate-1.5.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/com/fasterxml/classmate/1.5.1/classmate-1.5.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.github.classgraph:classgraph:4.8.83">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-bean-validators:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-boot-starter:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-core:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-data-rest:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-oas:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-schema:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spi:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-web:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-webflux:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-webmvc:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger2:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger-common:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger-ui:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger.core.v3:swagger-models:2.1.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger:swagger-models:1.5.20">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mapstruct:mapstruct:1.3.1.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../JAVA/LocalRepository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 24 - 3
java.iml

@@ -62,6 +62,29 @@
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.2" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.2" level="project" />
     <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.6.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
     <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
     <orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.21" level="project" />
     <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
@@ -96,9 +119,7 @@
     <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.38" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.9.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.9.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.3.4.RELEASE" level="project" />
@@ -126,7 +147,7 @@
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.14" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.14" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.14" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.3.3" level="project" />

+ 22 - 0
java/pom.xml

@@ -53,6 +53,28 @@
             <artifactId>swagger-annotations</artifactId>
             <version>1.6.2</version>
         </dependency>
+
+<!--        swagger APi文档-->
+        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+
         <dependency>
             <groupId>jakarta.validation</groupId>
             <artifactId>jakarta.validation-api</artifactId>

+ 1 - 0
java/src/main/java/boot/BootApplication.java

@@ -6,6 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
 @EnableAsync
 @EnableTransactionManagement

+ 0 - 1
java/src/main/java/boot/modules/manage/controller/ManageController.java

@@ -75,7 +75,6 @@ public class ManageController {
             //踢掉之前已经登录的token
             authService.checkLoginOnUser(user.getUsername(), token);
         }
-
         return ApiResult.ok(map).setMsg("登陆成功");
     }
 

+ 0 - 1
java/src/main/java/boot/modules/user/controller/UserController.java

@@ -79,7 +79,6 @@ public class UserController {
             //踢掉之前已经登录的token
             authService.checkLoginOnUser(user.getUsername(), token);
         }
-
         return ApiResult.ok(map).setMsg("登陆成功");
     }
 

File diff suppressed because it is too large
+ 893 - 143
java/target/classes/META-INF/spring-configuration-metadata.json


BIN
java/target/classes/boot/BootApplication.class


BIN
java/target/classes/boot/modules/manage/controller/ManageController.class


BIN
java/target/classes/boot/modules/user/controller/UserController.class


+ 1 - 1
vue_project/src/App.vue

@@ -7,7 +7,7 @@
 
 </script>
 
-<style>
+<style scoped>
 
 
 </style>

+ 5 - 0
vue_project/src/api/index.js

@@ -70,4 +70,9 @@ export const editCalendarInfo = (data) => {
 //删除备注数据接口
 export const deleteCalendarsInfo = (id) => {
   return request.delete("/calendar/delById/"+id)
+}
+
+//退出登录接口
+export const manLoginOut = () => {
+  return request.post("/manage/logout")
 }

+ 227 - 0
vue_project/src/assets/css/home.css

@@ -0,0 +1,227 @@
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    font-family: "Poppins", sans-serif;
+    /* 当用户手动导航或者 CSSOM scrolling API 触发滚动操作时 */
+    scroll-behavior: smooth;
+  }
+  
+  body {
+    min-height: 100vh;
+    
+    background: linear-gradient(#2b1055, #7597de);
+    font-family: Georgia, "Times New Roman", Times, serif;
+  }
+  
+  header {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    padding: 30px 100px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    z-index: 10000;
+  }
+  
+  header .logo {
+    color: #fff;
+    font-weight: 700;
+    text-decoration: none;
+    font-size: 2em;
+    text-transform: uppercase;
+    /* 大写 */
+    letter-spacing: 2px;
+    /* 字符间距 */
+  }
+  
+  header ul {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+  
+  header ul li {
+    list-style: none;
+    margin-left: 20px;
+  }
+  
+  header ul li a {
+    text-decoration: none;
+    padding: 6px 15px;
+    color: #fff;
+    border-radius: 20px;
+  }
+  
+  header ul li a:hover,
+  header ul li a.active {
+    background: #fff;
+    color: #2b1055;
+  }
+  
+  section {
+    position: relative;
+    width: 100%;
+    height: 100vh;
+    padding: 100px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    overflow: hidden;
+  }
+  
+  section::before {
+    content: "";
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    height: 100px;
+    background: linear-gradient(to top, #1c0522, transparent);
+    z-index: 1000;
+  }
+  
+  section img {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    /* object-fit CSS 属性指定可替换元素(例如:<img> 或 <video>)的内容应该如何适应到其使用高度和宽度确定的框。 */
+    object-fit: cover;
+    pointer-events: none;
+  }
+  
+  section img#moon {
+    /* mix-blend-mode CSS 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。 */
+    mix-blend-mode: screen;
+  }
+  
+  section img#mountains_front {
+    z-index: 10;
+  }
+  
+  #text {
+    position: absolute;
+    right: -350px;
+    color: #fff;
+    white-space: nowrap;
+    font-size: 7.5vw;
+    z-index: 9;
+  }
+  
+  #btn {
+    text-decoration: none;
+    display: inline-block;
+    padding: 8px 30px;
+    border-radius: 40px;
+    background: #fff;
+    color: #2b1055;
+    font-size: 1.5em;
+    z-index: 9;
+    transform: translateY(100px);
+  }
+  
+  .sec {
+    position: relative;
+    padding: 100px;
+    background: #1c0522;
+  }
+  
+  .sec h2 {
+    font-size: 3.5em;
+    margin-bottom: 10px;
+    color: #fff;
+  }
+  
+  .sec p {
+    font-size: 1em;
+    color: #fff;
+  }
+  
+  #stars {
+    animation: twinkle 2s linear infinite;
+  }
+  
+  @keyframes twinkle {
+    0% {
+      opacity: 1;
+    }
+  
+    50% {
+      opacity: 0.5;
+    }
+  
+    100% {
+      opacity: 1;
+    }
+  }
+  
+  #moon {
+    animation: moonRise 10s ease-in-out infinite alternate-reverse;
+    transform: translateY(10%);
+  }
+  
+  @keyframes moonRise {
+    0% {
+      transform: translateY(10%);
+    }
+  
+    100% {
+      transform: translateY(-10%);
+    }
+  }
+  
+  #text {
+    opacity: 0;
+    animation: fadeIn 3s forwards;
+  }
+  
+  @keyframes fadeIn {
+    0% {
+      opacity: 0;
+    }
+  
+    100% {
+      opacity: 1;
+    }
+  }
+  
+  #btn {
+    opacity: 0;
+    transform: translateY(100px);
+    animation: slideIn 1s ease forwards 0.5s;
+  }
+  
+  @keyframes slideIn {
+    0% {
+      transform: translateY(100px);
+      opacity: 0;
+    }
+  
+    100% {
+      transform: translateY(0);
+      opacity: 1;
+    }
+  }
+  
+  body {
+    background-image: linear-gradient(to bottom, #401055, #7c75de);
+    background-size: 100% 200%;
+    animation: gradientShift 15s ease infinite;
+  }
+  
+  @keyframes gradientShift {
+    0% {
+      background-position: 0% 50%;
+    }
+  
+    50% {
+      background-position: 100% 50%;
+    }
+  
+    100% {
+      background-position: 0% 50%;
+    }
+  }

+ 124 - 0
vue_project/src/assets/css/iconfont.css

@@ -0,0 +1,124 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2232321 */
+  src: url('iconfont.woff2?t=1637930257542') format('woff2'),
+       url('iconfont.woff?t=1637930257542') format('woff'),
+       url('iconfont.ttf?t=1637930257542') format('truetype'),
+       url('iconfont.svg?t=1637930257542#iconfont') format('svg');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.iconadd:before {
+  content: "\e664";
+}
+
+.iconashbin:before {
+  content: "\e665";
+}
+
+.iconbottom:before {
+  content: "\e666";
+}
+
+.iconbad:before {
+  content: "\e667";
+}
+
+.iconchart-pie:before {
+  content: "\e668";
+}
+
+.icondelete:before {
+  content: "\e66a";
+}
+
+.icondirection-down:before {
+  content: "\e66b";
+}
+
+.icondirection-right:before {
+  content: "\e66c";
+}
+
+.icondirection-up:before {
+  content: "\e66d";
+}
+
+.icondirection-left:before {
+  content: "\e66e";
+}
+
+.icondownload:before {
+  content: "\e66f";
+}
+
+.icongood:before {
+  content: "\e673";
+}
+
+.iconhome:before {
+  content: "\e674";
+}
+
+.iconlock:before {
+  content: "\e676";
+}
+
+.iconmenu:before {
+  content: "\e677";
+}
+
+.iconhelp:before {
+  content: "\e678";
+}
+
+.iconsearch:before {
+  content: "\e67d";
+}
+
+.iconsign-out:before {
+  content: "\e67e";
+}
+
+.iconselect:before {
+  content: "\e67f";
+}
+
+.iconsetting:before {
+  content: "\e680";
+}
+
+.iconarrow-up-filling:before {
+  content: "\e688";
+}
+
+.iconarrow-down-filling:before {
+  content: "\e689";
+}
+
+.iconarrow-left-filling:before {
+  content: "\e68a";
+}
+
+.iconarrow-right-filling:before {
+  content: "\e68b";
+}
+
+.iconnotification-filling:before {
+  content: "\e68c";
+}
+
+.iconuser-filling:before {
+  content: "\e68d";
+}
+
+.iconsorting:before {
+  content: "\e68e";
+}
+

File diff suppressed because it is too large
+ 0 - 0
vue_project/src/assets/css/iconfont.js


+ 198 - 0
vue_project/src/assets/css/iconfont.json

@@ -0,0 +1,198 @@
+{
+  "id": "2232321",
+  "name": "常用",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "15838424",
+      "name": "add",
+      "font_class": "add",
+      "unicode": "e664",
+      "unicode_decimal": 58980
+    },
+    {
+      "icon_id": "15838430",
+      "name": "ashbin",
+      "font_class": "ashbin",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "15838433",
+      "name": "bottom",
+      "font_class": "bottom",
+      "unicode": "e666",
+      "unicode_decimal": 58982
+    },
+    {
+      "icon_id": "15838435",
+      "name": "bad",
+      "font_class": "bad",
+      "unicode": "e667",
+      "unicode_decimal": 58983
+    },
+    {
+      "icon_id": "15838451",
+      "name": "chart-pie",
+      "font_class": "chart-pie",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "15838454",
+      "name": "delete",
+      "font_class": "delete",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "15838455",
+      "name": "direction-down",
+      "font_class": "direction-down",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "15838460",
+      "name": "direction-right",
+      "font_class": "direction-right",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "15838461",
+      "name": "direction-up",
+      "font_class": "direction-up",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "15838463",
+      "name": "direction-left",
+      "font_class": "direction-left",
+      "unicode": "e66e",
+      "unicode_decimal": 58990
+    },
+    {
+      "icon_id": "15838464",
+      "name": "download",
+      "font_class": "download",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "15838483",
+      "name": "good",
+      "font_class": "good",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "15838485",
+      "name": "home",
+      "font_class": "home",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "15838497",
+      "name": "lock",
+      "font_class": "lock",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "15838501",
+      "name": "menu",
+      "font_class": "menu",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "15838503",
+      "name": "help",
+      "font_class": "help",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "15838525",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "15838529",
+      "name": "sign-out",
+      "font_class": "sign-out",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "15838530",
+      "name": "select",
+      "font_class": "select",
+      "unicode": "e67f",
+      "unicode_decimal": 59007
+    },
+    {
+      "icon_id": "15838535",
+      "name": "setting",
+      "font_class": "setting",
+      "unicode": "e680",
+      "unicode_decimal": 59008
+    },
+    {
+      "icon_id": "15838581",
+      "name": "arrow-up-filling",
+      "font_class": "arrow-up-filling",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "15838582",
+      "name": "arrow-down-filling",
+      "font_class": "arrow-down-filling",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "15838583",
+      "name": "arrow-left-filling",
+      "font_class": "arrow-left-filling",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "15838584",
+      "name": "arrow-right-filling",
+      "font_class": "arrow-right-filling",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "15838605",
+      "name": "notification-filling",
+      "font_class": "notification-filling",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "15838606",
+      "name": "user-filling",
+      "font_class": "user-filling",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "15838620",
+      "name": "sorting",
+      "font_class": "sorting",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    }
+  ]
+}

File diff suppressed because it is too large
+ 54 - 0
vue_project/src/assets/css/iconfont.svg


BIN
vue_project/src/assets/css/iconfont.ttf


BIN
vue_project/src/assets/css/iconfont.woff


BIN
vue_project/src/assets/css/iconfont.woff2


BIN
vue_project/src/assets/images/华为.png


BIN
vue_project/src/assets/images/抖音.png


BIN
vue_project/src/assets/images/新浪微博.png


BIN
vue_project/src/assets/images/淘宝.png


BIN
vue_project/src/assets/images/阿里云.png


+ 281 - 3
vue_project/src/components/LoginForm.vue

@@ -12,7 +12,7 @@
           </div>
           <div class="form-wrapper">
             <!-- 账号 -->
-            <div class="input-wrapper user">
+            <div class="input-wrapper phone">
               <input type="text" class="inputs" v-model="loginForm.username" />
             </div>
             <!-- 密码 -->
@@ -88,6 +88,284 @@ const onLogin = async () => {
 };
 </script>
 
-<style scoped>
-@import url("../assets/css/style.scss");
+<style scoped lang="scss">
+* {
+  padding: 0;
+  margin: 0;
+}
+
+.content {
+  width: 100vw;
+  height: 100vh;
+  background-color: rgb(82, 84, 97);
+  position: relative;
+  .wrapper {
+    width: 70%;
+    height: 80%;
+    border-radius: 20px;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    background-image: linear-gradient(
+        to right top,
+        rgba(40, 42, 55, 1) 0%,
+        rgba(40, 42, 55, 1) 20%,
+        rgba(40, 42, 55, 0.9) 60%,
+        rgba(40, 42, 55, 0.4) 100%
+      ),
+      url(../assets/images/bg.jpg);
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: top;
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    padding: 80px;
+    box-sizing: border-box;
+    .form-wrapper {
+      width: 100%;
+      height: 50vh;
+      position: relative;
+      top: -10px;
+      .login-form,
+      .signup-form {
+        position: absolute;
+        transition: 0.5s;
+        .tips {
+          color: #fff;
+          h1 {
+            font-size: 45px;
+            margin: 20px 0;
+            font-family: "Newake", Times, serif;
+            letter-spacing: 2px;
+          }
+          span {
+            margin: 0 0 25px 0;
+            font-family: "Century Gothic", Times, serif;
+          }
+          span:first-child {
+            color: #d1d1d1;
+          }
+          span:last-child {
+            color: rgb(29, 144, 245);
+            cursor: pointer;
+          }
+        }
+        .form-wrapper {
+          .input-wrapper {
+            position: relative;
+            margin: 30px 0;
+            transition: 0.5s;
+            .inputs {
+              width: 100%;
+              height: 70px;
+              display: block;
+              border-radius: 18px;
+              border: 0;
+              background-color: rgb(52, 50, 69);
+              color: #fff;
+              padding: 20px 60px 0px 30px;
+              box-sizing: border-box;
+              outline: none;
+              font-size: 15px;
+              font-weight: 600;
+              font-family: "Century Gothic", Times, serif;
+              &:focus {
+                border: 1px solid rgb(21, 139, 243);
+                box-shadow: 0 0 1px 1px rgb(21, 139, 243);
+              }
+            }
+            &::before {
+              display: inline-block;
+              width: 50px;
+              height: 10px;
+              color: rgb(113, 114, 119);
+              position: absolute;
+              top: 10px;
+              left: 30px;
+              white-space: nowrap;
+              font-family: "Century Gothic", Times, serif;
+            }
+            &::after {
+              content: "";
+              display: inline-block;
+              width: 40px;
+              height: 40px;
+              position: absolute;
+              top: 36px;
+              right: 10px;
+              background-size: 50%;
+              background-repeat: no-repeat;
+              z-index: 1;
+              white-space: nowrap;
+            }
+          }
+          .user {
+            &::before {
+              content: "Email";
+            }
+            &::after {
+              background-image: url(../assets/images/email.png);
+            }
+          }
+          .pwd {
+            input {
+              letter-spacing: 2px;
+            }
+            &::before {
+              content: "Password";
+            }
+            &::after {
+              background-image: url(../assets/images/password.png);
+            }
+          }
+          .phone {
+            input {
+              letter-spacing: 2px;
+            }
+            &::before {
+              content: "Phone";
+            }
+            &::after {
+              background-image: url(../assets/images/password.png);
+            }
+          }
+          .veri-code {
+            opacity: 0;
+            z-index: -1;
+            position: relative;
+            transition: 0.5s;
+            .veri-code-input {
+              padding-right: 200px;
+            }
+            .veri-code-tips {
+              position: absolute;
+              right: 20px;
+              top: 36px;
+              color: rgb(39, 150, 247);
+              cursor: pointer;
+            }
+            &::before {
+              content: "Verification Code";
+            }
+          }
+        }
+        .form-btn {
+          width: 100%;
+          height: 60px;
+          background-color: rgb(0, 129, 241);
+          color: #fff;
+          border-radius: 50px;
+          border: 0;
+          font-size: 20px;
+          font-weight: 600;
+          margin: 15px auto;
+          cursor: pointer;
+          font-family: "Century Gothic", Times, serif;
+        }
+      }
+      .login-form {
+        z-index: 1;
+        opacity: 1;
+        animation: loginAnimation 1s;
+        animation-fill-mode: forwards;
+        animation-timing-function: ease;
+        .btn-wrapper {
+          display: flex;
+          transform: translate(0, -90px);
+          .login-btn {
+            flex: 1;
+            margin-left: 10px;
+            transition: 0.5s;
+            &:hover {
+              background-color: rgb(39, 150, 247);
+            }
+          }
+          .other-login-btn {
+            flex: 1;
+            margin-right: 10px;
+            transition: 0.5s;
+            background-color: rgb(85, 91, 105);
+            &:hover {
+              background-color: rgb(101, 109, 126);
+            }
+          }
+        }
+        .form-wrapper {
+          .other-login {
+            transform: translate(0, -60%);
+            .divider {
+              width: 100%;
+              margin: 20px 0;
+              text-align: center;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+              .line {
+                display: inline-block;
+                max-width: 45%;
+                width: 45%;
+                flex: 1;
+                height: 1px;
+                background-color: #fff;
+              }
+              .divider-text {
+                vertical-align: middle;
+                margin: 0px 20px;
+                line-height: 0;
+                display: inline-block;
+                width: 50px;
+                color: #fff;
+              }
+            }
+            .other-login-wrapper {
+              width: 100%;
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              .other-login-item {
+                border: 1px solid #fff;
+                padding: 10px;
+                text-align: center;
+                border-radius: 10px;
+                cursor: pointer;
+                font-weight: 600;
+                color: rgb(51, 49, 116);
+                margin: 0 10px;
+                img {
+                  width: 30px;
+                  height: 30px;
+                  vertical-align: middle;
+                }
+                span {
+                  vertical-align: middle;
+                }
+
+                &:hover {
+                  width: 80px;
+                  height: 50%;
+                  background-color: #ccc;
+                  border: 0;
+                  box-shadow: -20px 10px 32px 1px rgba(182, 183, 185, 0.37);
+                }
+              }
+            }
+          }
+        }
+      }
+      .signup-form {
+        opacity: 1;
+      }
+    }
+  }
+}
+@keyframes loginAnimation {
+  0% {
+    transform: translate(0, 100px);
+  }
+  100% {
+    transform: translate(0, 0px);
+  }
+}
 </style>

+ 9 - 3
vue_project/src/components/RegisterForm.vue

@@ -59,6 +59,8 @@
 import { ref } from "vue";
 import { registerVerify ,registerApi} from "../api/index";
 import { ElMessage } from "element-plus";
+import { useRouter } from "vue-router";
+const router = useRouter();
 
 let reckonTime; //计数器
 let reckonTimeFlag = 5; //倒计时
@@ -73,6 +75,7 @@ const registerForm = ref({
 
 //定时器
 const countDown = () => {
+  console.log("计数器");
   // 设置验证码读取效果
   let veriCodeTips = document.querySelector(".veri-code-tips");
   veriCodeTips.innerHTML = `RESEND(${reckonTimeFlag})`;
@@ -114,12 +117,13 @@ const getRegisterVerify = async () => {
       if (response.data.status == 200) {
         ElMessage.success("验证码:" + response.data.data);
         registerForm.value.captcha = response.data.data;
-      } else if (response.data.status == 500 && response.data.data != "501") {
+      } else if (response.data.status == 501) {
         ElMessage.warning(
           "验证码10分钟内有效, 请勿重复点击:" + response.data.data
         );
-        registerForm.value.captcha = response.data.data;
-      } else if (response.data.data == 501) {
+        const a = response.data.data.split(":")
+        registerForm.value.captcha = a[1];
+      } else if (response.data.status == 500) {
         ElMessage.error("手机号已经注册");
       }
     },
@@ -134,6 +138,8 @@ const onRegister = async () => {
   await registerApi(registerForm.value).then(
     (response) => {
       ElMessage.success("注册成功");
+      clearInterval(reckonTime);
+      router.push({ path: "/Login" });
     },
     (error) => {
       console.log("注册失败");

+ 0 - 50
vue_project/src/components/demo.vue

@@ -1,50 +0,0 @@
-<template>
-  <el-upload
-    class="upload-demo"
-    ref="picture"
-    drag
-    action="#"
-    :auto-upload="false"
-    accept=".png,.jpe,.jpeg"
-    :limit="1"
-    :on-exceed="exceedRange"
-    :on-progress="uploading"
-  >
-    <i class="el-icon-upload"></i>
-    <div class="el-upload__text"><em>可选</em></div>
-    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-    <div class="el-upload__tip" slot="tip">
-      只能上传jpg/png/jpeg文件,且不超过500kb,最多只能上传一张图片
-    </div>
-  </el-upload>
-  <el-button
-    style="margin-left: 10px"
-    size="small"
-    type="success"
-    @click="submitUpload"
-    >上传到服务器</el-button
-  >
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {
-    submitUpload() {
-      this.$refs.picture.submit();
-    },
-    exceedRange() {
-      this.$message({
-        type: "error",
-        message: "最多只能上传一张图片",
-      });
-    },
-    uploading(a, b) {
-      console.log(a);
-      console.log(b);
-    },
-  },
-};
-</script>

+ 236 - 131
vue_project/src/components/footer.vue

@@ -1,143 +1,248 @@
 <template>
-  <footer class="relative bg-blueGray-200 pt-8 pb-6">
-    <div class="container mx-auto px-4">
-      <div class="flex flex-wrap text-left lg:text-left">
-        <div class="w-full lg:w-6/12 px-4">
-          <h4 class="text-3xl fonat-semibold text-blueGray-700">
-            Let's keep in touch!
-          </h4>
-          <h5 class="text-lg mt-0 mb-2 text-blueGray-600">
-            Find us on any of these platforms, we respond 1-2 business days.
-          </h5>
-          <div class="mt-6 lg:mb-0 mb-6">
-            <button
-              class="bg-white text-lightBlue-400 shadow-lg font-normal h-10 w-10 items-center justify-center align-center rounded-full outline-none focus:outline-none mr-2"
-              type="button"
-            >
-              <img src="../assets/images/推特.png" /></button
-            ><button
-              class="bg-white text-lightBlue-600 shadow-lg font-normal h-10 w-10 items-center justify-center align-center rounded-full outline-none focus:outline-none mr-2"
-              type="button"
-            >
-              <img src="../assets/images/脸书.png" /></button
-            ><button
-              class="bg-white text-pink-400 shadow-lg font-normal h-10 w-10 items-center justify-center align-center rounded-full outline-none focus:outline-none mr-2"
-              type="button"
-            >
-              <img src="../assets/images/gitee.png" /></button
-            ><button
-              class="bg-white text-blueGray-800 shadow-lg font-normal h-10 w-10 items-center justify-center align-center rounded-full outline-none focus:outline-none mr-2"
-              type="button"
-            >
-              <img src="../assets/images/github.png" />
-            </button>
+  <footer>
+    <div class="container">
+      <div class="content_footer div">
+        <div class="profil div">
+          <div class="logo_area div">
+            <img src="../assets/images/华为.png" alt="" class="img1" />
+            <span class="logo_name">HUAWEI</span>
           </div>
-        </div>
-        <div class="w-full lg:w-6/12 px-4">
-          <div class="flex flex-wrap items-top mb-6">
-            <div class="w-full lg:w-4/12 px-4 ml-auto">
-              <span
-                class="block uppercase text-blueGray-500 text-sm font-semibold mb-2"
-                >Useful Links</span
-              >
-              <ul class="list-unstyled">
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://www.creative-tim.com/presentation?ref=njs-profile"
-                    >About Us</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://blog.creative-tim.com?ref=njs-profile"
-                    >Blog</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://www.github.com/creativetimofficial?ref=njs-profile"
-                    >Github</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://www.creative-tim.com/bootstrap-themes/free?ref=njs-profile"
-                    >Free Products</a
-                  >
-                </li>
-              </ul>
-            </div>
-            <div class="w-full lg:w-4/12 px-4">
-              <span
-                class="block uppercase text-blueGray-500 text-sm font-semibold mb-2"
-                >Other Resources</span
-              >
-              <ul class="list-unstyled">
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://github.com/creativetimofficial/notus-js/blob/main/LICENSE.md?ref=njs-profile"
-                    >MIT License</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://creative-tim.com/terms?ref=njs-profile"
-                    >Terms &amp; Conditions</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://creative-tim.com/privacy?ref=njs-profile"
-                    >Privacy Policy</a
-                  >
-                </li>
-                <li>
-                  <a
-                    class="text-blueGray-600 hover:text-blueGray-800 font-semibold block pb-2 text-sm"
-                    href="https://creative-tim.com/contact-us?ref=njs-profile"
-                    >Contact Us</a
-                  >
-                </li>
-              </ul>
-            </div>
+          <div class="desc_area">
+            <p>
+              Loremipsumdolorsitametconsectetur. adipisicing
+              elit.Tempora,consequatur modi tempore hic quod aperiaml
+            </p>
+          </div>
+          <div class="social_media">
+            <a href="#"><img src="../assets/images/抖音.png" alt=""></a>
+          <a href="#"><img src="../assets/images/新浪微博.png" alt=""></a>
+          <a href="#"><img src="../assets/images/阿里云.png" alt=""></a>
+          <a href="#"><img src="../assets/images/淘宝.png" alt=""></a>
           </div>
         </div>
+
+        <div class="service_area">
+          <ul class="service_header">
+            <li class="service_name">Services</li>
+            <li><a href="#">IT Consulting</a></li>
+            <li><a href="#">Development</a></li>
+            <li><a href="#">Clound</a></li>
+            <li><a href="#">DevOps & Support</a></li>
+          </ul>
+          <ul class="service_header">
+            <li class="service_name">Industries</li>
+            <li><a href="#">Finance</a></li>
+            <li><a href="#">Public Sector</a></li>
+            <li><a href="#">Smart office</a></li>
+            <li><a href="#">Retail</a></li>
+          </ul>
+          <ul class="service_header">
+            <li class="service_name">Company</li>
+            <li><a href="#">About China</a></li>
+            <li><a href="#">Blog</a></li>
+            <li><a href="#">Contact</a></li>
+            <li><a href="#">Join China</a></li>
+          </ul>
+        </div>
       </div>
-      <hr class="my-6 border-blueGray-300" />
-      <div
-        class="flex flex-wrap items-center md:justify-between justify-center"
-      >
-        <div class="w-full md:w-4/12 px-4 mx-auto text-center">
-          <div class="text-sm text-blueGray-500 font-semibold py-1">
-            Copyright © <span id="get-current-year">2021</span>
-            <a
-              href="https://www.creative-tim.com/product/notus-js"
-              class="text-blueGray-500 hover:text-gray-800"
-              target="_blank"
-            >
-              Notus JS by
-            </a>
-            <a
-              href="https://www.creative-tim.com?ref=njs-profile"
-              class="text-blueGray-500 hover:text-blueGray-800"
-              >Creative Tim</a
-            >.
-          </div>
+      <hr />
+      <div class="footer_bottom">
+        <div class="copy_right">
+          <i class="bx bxl-github"></i>
+          <span>2024 Github</span>
+        </div>
+        <div class="tou">
+          <a href="#">Term of Use</a>
+          <a href="#">Privacy Policy</a>
+          <a href="#">Cookie</a>
         </div>
       </div>
     </div>
   </footer>
 </template>
 
-<script>
-export default {};
-</script>
+<style scoped>
+* {
+  padding: 0;
+  margin: 0;
+  box-sizing: border-box;
+}
+
+body {
+  background-color: azure;
+}
+
+li {
+  list-style: none;
+}
+
+a {
+  text-decoration: none;
+}
+
+main {
+  width: 100%;
+}
+
+footer {
+  position: relative;
+  width: 100%;
+  bottom: 0;
+  left: 0;
+  background-color: #fff;
+  box-shadow: 0 16px 70px -8px rgba(0, 0, 0, 0.25);
+  border-radius: 20px 20px 0 0;
+  transition: 0.3s linear;
+}
+
+.img1 {
+  width: 50px;
+  height: 50px;
+}
+
+.container {
+  max-width: 1240px;
+  padding: 30px 40px;
+  margin: auto;
+}
+
+.content_footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 1rem;
+}
+
+.profil .logo_area {
+  display: flex;
+  align-items: center;
+  margin-bottom: 1rem;
+}
+
+.profil .logo_area img {
+  border-radius: 50%;
+  border: 1px solid #fff;
+}
+
+.logo_area .logo_name {
+  font-size: 1.5rem;
+  font-weight: 700;
+  margin: 0 1rem;
+  color: #000;
+}
+
+.desc_area {
+  max-width: 320px;
+  margin-bottom: 1.25rem;
+}
+
+.desc_area p {
+  color: #828282;
+  font-weight: 400;
+  line-height: 30px;
+}
+
+.social_media a {
+  color: #828282;
+  margin-right: 24px;
+  font-size: 26px;
+}
+
+.social_media a:hover {
+  color: #313131;
+}
+
+.service_area {
+  display: flex;
+}
+
+.service_header {
+  margin-right: 40px;
+}
+
+li.service_name {
+  color: #000;
+  font-weight: 600;
+}
+
+.service_header li a {
+  color: #828282;
+  padding-bottom: 1px;
+  font-weight: 400;
+}
+
+.service_header li a:hover {
+  color: #313131;
+}
+
+.service_header li {
+  margin-bottom: 10px;
+}
+
+hr {
+  height: 1px;
+  border: none;
+  background-color: #828282;
+  margin-bottom: 1rem;
+}
+
+.footer_bottom {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 0.875rem;
+}
+
+.copy_right {
+  color: #828282;
+  display: flex;
+  align-items: center;
+}
+
+.copy_right span {
+  margin-left: 8px;
+  font-weight: 400;
+  letter-spacing: 0.135rem;
+}
+
+.tou a {
+  color: #828282;
+  margin-left: 1.5rem;
+}
+
+.tou a:hover {
+  color: #313131;
+}
+
+@media screen and (max-width: 768px) {
+  .content_footer {
+    flex-wrap: wrap;
+    justify-content: left;
+  }
+
+  .service_area {
+    flex-wrap: wrap;
+    justify-content: left;
+  }
+
+  .service_header {
+    margin-left: 0;
+    margin-right: 40px;
+  }
+
+  .social_media {
+    margin-bottom: 1rem;
+  }
 
-<style></style>
+  .footer_bottom {
+    flex-wrap: wrap;
+    justify-self: center;
+  }
+}
+.social_media a img {
+    width: 30px;
+    height: 30px;
+    float: left;
+    margin-right: 20px;
+}
+</style>

+ 31 - 33
vue_project/src/components/home.vue

@@ -14,7 +14,7 @@
   </header>
   <section>
     <img src="../assets/images/stars.png" id="stars" />
-    <img src="../assets/images/moon.png" id="moon" />
+    <img src="../assets/images/Moon.png" id="moon" />
     <img src="../assets/images/mountains_behind.png" id="mountains_behind" />
     <h2 id="text">Moon Light</h2>
     <a href="#sec" id="btn">Explore</a>
@@ -33,40 +33,40 @@
 </template>
 
 <script>
+
 export default {};
 </script>
 
-<style scoped lang="scss">
+<style scoped >
 /* 这是引入了一些字体 */
-@import url("https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700,800,900&display=swap");
-
-* {
-  margin: 0;
-  padding: 0;
-  box-sizing: border-box;
-  font-family: "Poppins", sans-serif;
-  /* 当用户手动导航或者 CSSOM scrolling API 触发滚动操作时 */
-  scroll-behavior: smooth;
-}
+  @import url("https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700,800,900&display=swap");
+
+  * {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    font-family: "Poppins", sans-serif;
+    scroll-behavior: smooth;
+  }
 
-body {
-  min-height: 100vh;
-  overflow-x: hidden;
-  background: linear-gradient(#2b1055, #7597de);
-  font-family: Georgia, "Times New Roman", Times, serif;
-}
+  body {
+    min-height: 100vh;
+    
+    background: linear-gradient(#2b1055, #7597de);
+    font-family: Georgia, "Times New Roman", Times, serif;
+  }
 
-header {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  padding: 30px 100px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  z-index: 10000;
-}
+  header {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    padding: 30px 100px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    z-index: 10000;
+  }
 
 header .logo {
   color: #fff;
@@ -93,13 +93,13 @@ header ul li {
 header ul li a {
   text-decoration: none;
   padding: 6px 15px;
-  color: #fff;
+  color: cornflowerblue;
   border-radius: 20px;
 }
 
 header ul li a:hover,
 header ul li a.active {
-  background: #fff;
+  background: lightskyblue;
   color: #2b1055;
 }
 
@@ -130,13 +130,11 @@ section img {
   left: 0;
   width: 100%;
   height: 100%;
-  /* object-fit CSS 属性指定可替换元素(例如:<img> 或 <video>)的内容应该如何适应到其使用高度和宽度确定的框。 */
   object-fit: cover;
   pointer-events: none;
 }
 
 section img#moon {
-  /* mix-blend-mode CSS 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。 */
   mix-blend-mode: screen;
 }
 

+ 0 - 3
vue_project/src/components/index.vue

@@ -7,21 +7,18 @@
     <indexHeader />
   </div>
   <indexBody />
-  <!-- <footerVue /> -->
 </template>
 
 <script>
 import indexNavVue from "./indexNav.vue";
 import indexHeader from "./indexHeader.vue";
 import indexBody from "./indexBody.vue";
-import footerVue from "./footer.vue";
 
 export default {
   components: {
     indexNavVue,
     indexHeader,
     indexBody,
-    footerVue,
   },
 };
 </script>

+ 774 - 129
vue_project/src/components/indexBody.vue

@@ -1,106 +1,294 @@
 <template>
-  <!-- 学期多选框 -->
-  <el-select
-    v-model="selectedTerms"
-    multiple
-    :placeholder="select"
-    size="large"
-    @change="changeTerm"
-    style="width: 240px; margin-left: 1300px; margin-top: 10px"
-  >
-    <el-option
-      v-for="(term, index) in terms"
-      :key="index"
-      :label="term.label"
-      :value="index"
-    ></el-option>
-  </el-select>
-  <FullCalendar :options="calendarOptions" class="calendar" id="calendar" />
-
-  <!-- 备注修改框 -->
-  <el-dialog title="添加备注" center v-model="Visible">
-    <el-form :model="form" label-width="auto" style="max-width: 600px">
-      <el-form-item label="备注名称">
-        <el-input v-model="form.name" />
-      </el-form-item>
-      <el-form-item label="时间">
-        <el-date-picker
-          :span="11"
-          v-model="form.date"
-          type="daterange"
-          range-separator="To"
-          start-placeholder="开始日期"
-          end-placeholder="结束"
-          style="width: 100%"
-          format="YYYY/MM/DD"
-          value-format="YYYY-MM-DD"
-        />
-        <!-- 
-        <el-col>
-          <el-date-picker
-            v-model="form.date1"
-            type="date"
-            placeholder="日期"
-            style="width: 100%"
-            format="YYYY/MM/DD"
-            value-format="YYYY-MM-DD"
+  <div class="main">
+    <!-- 学期多选框 -->
+    <div class="content">
+      <div class="term">
+        <div class="term_content">
+          <el-select
+            v-if="tmp"
+            v-model="selectedTermIndex"
+            :placeholder="select"
+            size="large"
+            @change="handleTermSelection"
+            style="width: 240px"
+            :disabled="isYearSelecting"
+          >
+            <el-option
+              v-for="(term, index) in terms"
+              :key="index"
+              :label="term.label"
+              :value="index"
+            ></el-option>
+          </el-select>
+          <el-button type="primary" @click="showActionsDialog('term')"
+            >修改学期</el-button
+          >
+        </div>
+
+        <div class="term_content">
+          <el-select
+            v-if="yearTmp"
+            v-model="selectedAcademicYear"
+            :placeholder="selectYear"
+            size="large"
+            @change="handleSelectionYear"
+            style="width: 240px; margin-top: 10px"
+            :disabled="isTermSelecting"
+          >
+            <el-option
+              v-for="(year, index) in academicYears"
+              :key="index"
+              :label="year.label"
+              :value="index"
+            ></el-option>
+          </el-select>
+
+          <!-- 确保调用正确的对话框显示方法 -->
+          <el-button type="primary" @click="showAcademicYearActionsDialog"
+            >修改学年</el-button
+          >
+        </div>
+      </div>
+
+      <el-dialog title="学期管理" v-model="actionsVisible" width="30%">
+        <!-- 操作选项 -->
+        <el-radio-group v-model="selectedAction" @change="onActionSelected">
+          <el-radio :value="'add'">添加学期</el-radio>
+          <el-radio :value="'edit'">更改学期</el-radio>
+          <el-radio :value="'delete'">删除学期</el-radio>
+        </el-radio-group>
+
+        <!-- 添加/编辑表单 -->
+        <el-form
+          v-if="selectedAction !== 'delete'"
+          :model="termForm"
+          label-width="80px"
+        >
+          <el-form-item label="学期名称">
+            <el-input v-model="termForm.label" />
+          </el-form-item>
+          <el-form-item label="开始日期">
+            <el-date-picker
+              v-model="termForm.startDate"
+              type="date"
+              placeholder="选择开始日期"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+          <el-form-item label="结束日期">
+            <el-date-picker
+              v-model="termForm.endDate"
+              type="date"
+              placeholder="选择结束日期"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+        </el-form>
+
+        <!-- 仅在编辑时显示学期选择器 -->
+        <el-select
+          v-if="selectedAction === 'edit'"
+          v-model="selectedTermIndex"
+          placeholder="请选择学期"
+          @change="loadTermDetails"
+        >
+          <el-option
+            v-for="(term, index) in terms"
+            :key="index"
+            :label="term.label"
+            :value="index"
           />
-        </el-col>
-
-        <el-col>
-          <el-time-select
-            v-model="form.date2"
-            placeholder="详细时刻"
-            style="width: 100%"
-            start="00:00"
-            step="01:00"
-            end="24:00"
+        </el-select>
+
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button @click="actionsVisible = false">取消</el-button>
+            <el-button
+              type="primary"
+              :disabled="!canExecuteAction"
+              @click="executeAction"
+              >{{ getActionButtonText }}</el-button
+            >
+          </span>
+        </template>
+      </el-dialog>
+
+      <!-- 学年修改框 -->
+      <el-dialog
+        title="学年管理"
+        v-model="academicYearActionsVisible"
+        width="30%"
+      >
+        <el-radio-group
+          v-model="selectedAcademicAction"
+          @change="onAcademicActionSelected"
+        >
+          <el-radio :value="'add'">添加学年</el-radio>
+          <el-radio :value="'edit'">更改学年</el-radio>
+          <el-radio :value="'delete'">删除学年</el-radio>
+        </el-radio-group>
+
+        <el-form
+          v-if="selectedAcademicAction !== 'delete'"
+          :model="academicYearForm"
+          label-width="80px"
+        >
+          <el-form-item label="学年名称">
+            <el-input v-model="academicYearForm.name" />
+          </el-form-item>
+          <el-form-item label="开始日期">
+            <el-date-picker
+              v-model="academicYearForm.startDate"
+              type="date"
+              placeholder="选择开始日期"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+          <el-form-item label="结束日期">
+            <el-date-picker
+              v-model="academicYearForm.endDate"
+              type="date"
+              placeholder="选择结束日期"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+        </el-form>
+
+        <!-- 仅在编辑时显示学年选择器 -->
+        <el-select
+          v-if="selectedAcademicAction === 'edit'"
+          v-model="selectedAcademicYearIndex"
+          placeholder="请选择学年"
+          @change="loadAcademicYearDetails"
+        >
+          <el-option
+            v-for="(year, index) in academicYears"
+            :key="index"
+            :label="year.label"
+            :value="index"
           />
-        </el-col> -->
-      </el-form-item>
-
-      <el-upload
-        class="upload-demo"
-        ref="picture"
-        drag
-        action="/api/uploads"
-        accept=".png,.jpe,.jpeg"
-        :on-success="uploadSuccess"
-        :limit="1"
-        :on-exceed="exceedRange"
+        </el-select>
+
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button @click="academicYearActionsVisible = false"
+              >取消</el-button
+            >
+            <el-button
+              type="primary"
+              :disabled="!canExecuteAcademicAction"
+              @click="executeAcademicAction"
+              >{{ getAcademicActionButtonText }}</el-button
+            >
+          </span>
+        </template>
+      </el-dialog>
+
+      <FullCalendar :options="calendarOptions" class="calendar" id="calendar" />
+
+      <!-- 备注修改框 -->
+      <el-dialog title="添加备注" center v-model="Visible" :show-close="false">
+        <el-form :model="form" label-width="auto" style="max-width: 600px">
+          <el-form-item label="备注名称">
+            <el-input v-model="form.name" />
+          </el-form-item>
+          <el-form-item label="时间">
+            <el-date-picker
+              :span="11"
+              v-model="form.date"
+              type="daterange"
+              range-separator="To"
+              start-placeholder="开始日期"
+              end-placeholder="结束"
+              style="width: 100%"
+              format="YYYY/MM/DD"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+
+          <el-upload
+            class="upload-demo"
+            ref="picture"
+            drag
+            action="/api/uploads"
+            accept=".png,.jpe,.jpeg"
+            :on-success="uploadSuccess"
+            :limit="1"
+            :on-exceed="exceedRange"
+          >
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text"><em>可选</em></div>
+            <div class="el-upload__text">
+              将文件拖到此处,或<em>点击上传</em>
+            </div>
+            <div class="el-upload__tip" slot="tip">
+              只能上传jpg/png/jpeg文件,且不超过500kb,最多只能上传一张图片
+            </div>
+          </el-upload>
+          <el-form-item label="详细信息">
+            <el-input v-model="form.desc" type="textarea" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="confirm">确定</el-button>
+            <el-button @click="cancel">取消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+
+      <!-- 对备注进行操作 -->
+      <el-dialog
+        title="备注信息修改"
+        center
+        v-model="changeInfo"
+        :show-close="false"
       >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text"><em>可选</em></div>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip" slot="tip">
-          只能上传jpg/png/jpeg文件,且不超过500kb,最多只能上传一张图片
-        </div>
-      </el-upload>
-      <el-form-item label="详细信息">
-        <el-input v-model="form.desc" type="textarea" />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="confirm">确定</el-button>
-        <el-button @click="cancel">取消</el-button>
-      </el-form-item>
-    </el-form>
-  </el-dialog>
-
-  <!-- 对备注进行操作 -->
-  <el-dialog title="备注信息修改" center v-model="changeInfo">
-    <el-form-item label="操作">
-      <el-radio-group v-model="operateSelect">
-        <el-radio value="delete">删除备注</el-radio>
-        <el-radio value="edit">修改备注</el-radio>
-      </el-radio-group>
-    </el-form-item>
-    <el-form-item>
-      <el-button type="primary" @click="operate(this.operateSelect)"
-        >确定</el-button
+        <el-form-item label="操作">
+          <el-radio-group v-model="operateSelect">
+            <el-radio value="delete">删除备注</el-radio>
+            <el-radio value="edit">修改备注</el-radio>
+            <el-radio value="copy">复制备注</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="operate(this.operateSelect)"
+            >确定</el-button
+          >
+          <el-button @click="operateCancel">取消</el-button>
+        </el-form-item>
+      </el-dialog>
+
+      <!-- 复制备注对话框 -->
+      <el-dialog
+        title="复制备注至指定日期"
+        center
+        v-model="chooseCopy"
+        :show-close="false"
       >
-      <el-button @click="operateCancel">取消</el-button>
-    </el-form-item>
-  </el-dialog>
+        <el-form :model="form" label-width="auto" style="max-width: 600px">
+          <el-form-item label="备注名称">
+            <el-input v-model="form.name" />
+          </el-form-item>
+          <el-form-item label="时间">
+            <el-date-picker
+              :span="11"
+              v-model="form.date"
+              type="daterange"
+              range-separator="To"
+              start-placeholder="开始日期"
+              end-placeholder="结束"
+              style="width: 100%"
+              format="YYYY/MM/DD"
+              value-format="YYYY-MM-DD"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="certainCopy">确定</el-button>
+            <el-button @click="clearForm, (chooseCopy = false)">取消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+    </div>
+  </div>
 </template>
 <script>
 import FullCalendar from "@fullcalendar/vue3";
@@ -133,6 +321,52 @@ export default {
   },
   data() {
     return {
+      isTermSelecting: false, // 标记学期选择器是否在操作中
+      isYearSelecting: false, // 标记学年选择器是否在操作中
+      selectedAcademicYear: "", // 确保初始值为空字符串
+      // 学年修改属性
+      yearTmp: true,
+      selectYear: "请选择学年",
+
+      academicYears: [
+        // 可供选择的学年选项
+        {
+          label: "2022-2023学年",
+          startDate: "2022-09-01",
+          endDate: "2023-08-31",
+        },
+        {
+          label: "2023-2024学年",
+          startDate: "2023-09-01",
+          endDate: "2024-08-31",
+        },
+        {
+          label: "2024-2025学年",
+          startDate: "2024-09-01",
+          endDate: "2025-08-31",
+        },
+      ],
+      academicYearActionsVisible: false, // 控制学年对话框显示
+      selectedAcademicAction: "", // 当前选择的操作类型
+      academicYearForm: {
+        name: "",
+        startDate: "",
+        endDate: "",
+      },
+      selectedAcademicYearIndex: null, // 选中学年的索引
+      canExecuteAcademicAction: false, // 控制操作按钮是否可用
+
+      // 学期修改属性
+      tmp: true,
+      actionsVisible: false,
+      selectedAction: "",
+      termForm: {
+        label: "",
+        startDate: "",
+        endDate: "",
+      },
+      selectedTermIndex: null,
+
       // 多选框数据
       selectedTerms: [], // 用于存储选中的学期索引数组
       select: "请选择学期",
@@ -181,6 +415,7 @@ export default {
         desc: "",
         url: "",
       },
+      chooseCopy: false, //是否显示复制对话框
 
       // 日历数据
       calendarOptions: {
@@ -200,7 +435,7 @@ export default {
         editable: true, // 确定是否可以修改日历上的事件。
         dayMaxEventRows: 2, // 允许事件堆叠,但不超过设定的行数
         navLinks: true, // 可以单击日/周名称来导航视图
-        timeZone: 'none' ,  //时区关闭
+        timeZone: "none", //时区关闭
 
         buttonText: {
           prev: "上一页",
@@ -254,38 +489,180 @@ export default {
         aspectRatio: 1.2, //宽高比
       },
       validRange: {
-        start: "2022-08-26",
-        end: "2023-02-16",
+        start: "2020-08-26",
+        end: "2025-02-16",
       },
     };
   },
 
+  // 判断 学期学年修改的确认按钮
+  computed: {
+    canExecuteAction() {
+      return (
+        this.selectedAction !== "" &&
+        (this.selectedAction !== "edit" || this.selectedTermIndex !== null)
+      );
+    },
+    getActionButtonText() {
+      return this.selectedAction === "delete" ? "删除" : "确认";
+    },
+    getAcademicActionButtonText() {
+      if (this.selectedAcademicAction === "add") return "添加";
+      if (this.selectedAcademicAction === "edit") return "保存更改";
+      if (this.selectedAcademicAction === "delete") return "删除";
+      else return "确认";
+    },
+  },
   methods: {
-    eventChangeEdit() {
-      this.calendarOptions.events[0].editable = true
-      console.log(this.calendarOptions.events);
+    // 修改学期
+    showActionsDialog(dialogType) {
+      this.actionsVisible = true;
+      this.selectedAction = ""; // 清空之前的选择
+      if (dialogType === "term") {
+        this.$nextTick(() => {
+          // 确保dialog完全打开后再执行,如果有必要的话
+        });
+      }
+    },
+    onActionSelected() {
+      // 重置表单
+      if (this.selectedAction === "add") {
+        this.termForm = { label: "", startDate: "", endDate: "" };
+      } else if (this.selectedAction === "edit") {
+        this.selectedTermIndex = null; // 重置学期选择
+      }
+    },
+    loadTermDetails(index) {
+      if (index !== null) {
+        const selectedTerm = this.terms[index];
+        this.termForm = { ...selectedTerm };
+      }
+    },
+    executeAction() {
+      if (this.selectedAction === "add") {
+        this.addTerm();
+      } else if (this.selectedAction === "edit") {
+        this.editTerm();
+      } else if (this.selectedAction === "delete") {
+        this.deleteTerm();
+      }
+      this.actionsVisible = false;
+      this.selectedAction = ""; // 重置操作
+    },
+    addTerm() {
+      console.log("Adding term:", this.termForm);
+      // 确保使用termForm.label作为label,如果没有则可能需要处理错误情况
+      if (this.termForm.label == "" || this.termForm.label == null) {
+        ElMessage.error("名字不能为空");
+        return; // 或者提示用户名称是必填项
+      } else {
+        this.terms.push({
+          label: this.termForm.label, // 使用用户输入的名称
+          startDate: this.termForm.startDate,
+          endDate: this.termForm.endDate,
+        });
+        this.select = this.termForm.label;
+        ElMessage.success("添加成功");
+        this.calendarOptions.validRange = {
+          start: this.termForm.startDate,
+          end: this.termForm.endDate,
+        };
+
+        // 清空表单以便下一次输入
+        this.termForm.label = "";
+        this.termForm.startDate = "";
+        this.termForm.endDate = "";
+      }
+    },
+    editTerm() {
+      // 编辑学期逻辑
+      if (this.selectedTermIndex !== null) {
+        this.terms[this.selectedTermIndex] = {
+          startDate: this.termForm.startDate,
+          endDate: this.termForm.startDate,
+          label: this.name,
+        };
+        this.terms[this.selectedTermIndex] = { ...this.termForm };
+
+        this.calendarOptions.validRange = {
+          start: this.termForm.startDate,
+          end: this.termForm.endDate,
+        };
+        console.log(this.calendarOptions.validRange);
+        ElMessage.success("学期编辑成功");
+      } else {
+        ElMessage.error("无法编辑空学期");
+      }
+    },
+    handleTermSelection(index) {
+      if (index !== null && this.terms[index]) {
+        this.selectedTermIndex = index;
+        const selectedTerm = this.terms[index];
+        this.calendarOptions.validRange = {
+          start: selectedTerm.startDate + " 00:00:00",
+          end: selectedTerm.endDate + " 23:59:59",
+        };
+        // 如果需要,可以在这里添加其他逻辑,比如加载学期详情等
+        this.isTermSelecting = true;
+        this.isYearSelecting = false;
+      }
+    },
+
+    deleteTerm() {
+      if (
+        this.selectedTermIndex !== null &&
+        this.selectedTermIndex >= 0 &&
+        this.selectedTermIndex < this.terms.length
+      ) {
+        this.$nextTick(() => {
+          this.terms.splice(this.selectedTermIndex, 1);
+          // 重置selectedTermIndex为无效值
+          this.selectedTermIndex = "";
+          // 更新占位符文本
+          this.select = "请选择学期";
+          this.tmp = false; // 如果tmp用于控制显示,确保其值更新
+          this.tmp = true;
+        });
+        ElMessage.success("学期删除成功");
+        console.log("删除成功", this.select);
+        this.resetToDefaultTermRange();
+      } else {
+        ElMessage.error("请选择具体学期,无法删除空学期");
+      }
+      this.isTermSelecting = false;
+      this.isYearSelecting = false;
+    },
+    resetToDefaultTermRange() {
+      console.log("重置", this.placeholder);
+      this.calendarOptions.validRange = {
+        start: "2020-08-26",
+        end: "2025-02-16",
+      };
+      this.select = "请选择";
+      if (this.calendar) {
+        this.calendar.setOption("validRange", this.calendarOptions.validRange);
+
+        this.calendar.render();
+      }
     },
+
     // 多选框变换
     changeTerm() {
       let minStartDate = null;
       let maxEndDate = null;
 
-      // 遍历选中的学期
-      this.selectedTerms.forEach((index) => {
-        const term = this.terms[index];
-        if (!term) return; // 确保term存在
-
-        // 更新最小开始日期和最大结束日期
-        if (
-          !minStartDate ||
-          new Date(term.startDate) < new Date(minStartDate)
-        ) {
-          minStartDate = term.startDate;
-        }
-        if (!maxEndDate || new Date(term.endDate) > new Date(maxEndDate)) {
-          maxEndDate = term.endDate;
-        }
-      });
+      console.log(this.selectedTerms);
+      console.log(this.terms);
+
+      const term = this.terms[this.selectedTerms];
+      if (!term) return; // 确保term存在
+      //更新最小开始日期和最大结束日期
+      if (!minStartDate || new Date(term.startDate) < new Date(minStartDate)) {
+        minStartDate = term.startDate;
+      }
+      if (!maxEndDate || new Date(term.endDate) > new Date(maxEndDate)) {
+        maxEndDate = term.endDate;
+      }
 
       // 如果有选中的学期,更新validRange
       if (minStartDate && maxEndDate) {
@@ -304,10 +681,231 @@ export default {
       // 应用更新
       if (this.calendar) {
         this.calendar.setOption("validRange", this.calendarOptions.validRange);
+
         this.calendar.render();
       }
     },
 
+    // 学年选择
+    // 修改changeAcademicYear方法,整合handleSelectionYear逻辑
+    changeAcademicYear(value) {
+      // 找到选中的学年对象
+      const selectedYear = this.academicYears.find(
+        (year) => year.value === value
+      );
+
+      if (selectedYear) {
+        // 更新索引
+        this.selectedAcademicYearIndex = this.academicYears.findIndex(
+          (year) => year.value === value
+        );
+        // 更新绑定的学年值
+        this.selectedAcademicYear = selectedYear.value;
+        // 更新日历的有效日期范围
+        this.calendarOptions.validRange = {
+          start: selectedYear.startDate + " 00:00:00",
+          end: selectedYear.endDate + " 23:59:59",
+        };
+
+        if (this.calendar) {
+          this.calendar.setOption(
+            "validRange",
+            this.calendarOptions.validRange
+          );
+          this.calendar.render();
+        }
+      } else {
+        // 如果没有找到匹配的学年,可以重置或处理异常情况
+        this.selectedAcademicYear = ""; // 或者其他默认值
+        this.selectedAcademicYearIndex = null;
+        // 重置日历范围为默认值
+        this.updateCalendarRange({
+          start: "2022-01-01 00:00:00",
+          end: "2025-12-31 23:59:59",
+        });
+      }
+    },
+
+    // 新增方法
+    showAcademicYearActionsDialog() {
+      this.academicYearActionsVisible = true;
+      this.selectedAcademicAction = "";
+      this.academicYearForm = { name: "", startDate: "", endDate: "" }; // 重置表单
+    },
+
+    onAcademicActionSelected() {
+      // 重置表单或逻辑
+      if (this.selectedAcademicAction === "add") {
+        this.academicYearForm = { name: "", startDate: "", endDate: "" };
+      } else if (this.selectedAcademicAction === "edit") {
+        this.selectedAcademicYearIndex = null; // 重置学年选择
+      }
+      this.canExecuteAcademicAction = this.selectedAcademicAction !== ""; // 允许操作
+    },
+
+    loadAcademicYearDetails(index) {
+      if (index !== null && this.academicYears[index]) {
+        this.academicYearForm = {
+          name: this.academicYears[index].label,
+          startDate: this.academicYears[index].startDate.split(" ")[0],
+          endDate: this.academicYears[index].endDate.split(" ")[0],
+        };
+        this.selectedAcademicYearIndex = index;
+      }
+    },
+
+    executeAcademicAction() {
+      if (this.selectedAcademicAction === "add") {
+        this.addAcademicYear();
+      } else if (this.selectedAcademicAction === "edit") {
+        this.editAcademicYear();
+      } else if (this.selectedAcademicAction === "delete") {
+        this.deleteAcademicYear();
+      }
+      this.academicYearActionsVisible = false;
+      this.selectedAcademicAction = ""; // 重置操作
+    },
+
+    // 确保在用户界面交互中正确调用此方法来设置选中学年索引
+    handleSelectionYear(index) {
+      if (index !== null && this.academicYears[index]) {
+        // 更新选中学年索引
+        this.selectedAcademicYearIndex = index;
+        // 直接根据索引获取学年对象并更新selectedAcademicYear
+        this.selectedAcademicYear = this.academicYears[index].label; // 假定label作为展示值,根据实际需求调整
+        // 更新日历的有效日期范围
+        this.updateCalendarRange({
+          start: this.academicYears[index].startDate + " 00:00:00",
+          end: this.academicYears[index].endDate + " 23:59:59",
+        });
+      }
+    },
+
+    // 新增学年
+    addAcademicYear() {
+      if (this.validateAcademicYearForm()) {
+        const newYear = {
+          label: this.academicYearForm.name,
+          startDate: this.academicYearForm.startDate,
+          endDate: this.academicYearForm.endDate,
+        };
+        this.academicYears.push(newYear);
+
+        // 更新UI
+        this.selectYear = newYear.label; // 更新占位符文本
+        this.updateCalendarRange({
+          start: newYear.startDate,
+          end: newYear.endDate,
+        });
+
+        // 清空表单
+        this.resetAcademicYearForm();
+
+        // 提示信息
+        ElMessage.success("添加学年成功");
+        this.academicYearActionsVisible = false;
+        this.selectedAcademicAction = "";
+      } else {
+        ElMessage.error("表单验证未通过,请检查输入信息。");
+      }
+      this.selectedAcademicYearIndex = null; // 如果适用,重置选中的学年索引
+    },
+
+    editAcademicYear() {
+      if (this.selectedAcademicYearIndex !== null) {
+        if (this.validateAcademicYearForm()) {
+          const updatedYear = {
+            label: this.academicYearForm.name,
+            startDate: this.academicYearForm.startDate,
+            endDate: this.academicYearForm.endDate,
+          };
+          this.academicYears[this.selectedAcademicYearIndex] = updatedYear;
+
+          // 更新UI
+          this.$nextTick(() => {
+            this.updateCalendarRange({
+              start: updatedYear.startDate,
+              end: updatedYear.endDate,
+            });
+            this.selectYear = updatedYear.label; // 更新占位符文本
+          });
+
+          // 重置表单
+          this.resetAcademicYearForm();
+
+          // 关闭对话框并重置操作
+          this.academicYearActionsVisible = false;
+          this.selectedAcademicAction = "";
+          ElMessage.success("编辑学年成功");
+        } else {
+          ElMessage.error("表单验证未通过,请检查输入信息。");
+        }
+      } else {
+        ElMessage.error("没有选中学年进行编辑。");
+      }
+      this.selectedAcademicYearIndex = null; // 如果适用,重置选中的学年索引
+    },
+
+    // 确保删除功能的打印语句在正确的位置执行
+    deleteAcademicYear() {
+      if (
+        this.selectedAcademicYearIndex !== null &&
+        this.selectedAcademicYearIndex >= 0 &&
+        this.selectedAcademicYearIndex < this.academicYears.length
+      ) {
+        this.academicYears.splice(this.selectedAcademicYearIndex, 1);
+        this.selectedAcademicYearIndex = null;
+
+        // 重置UI
+        this.selectYear = "请选择学年";
+        this.updateCalendarRange({
+          start: "2022-01-01 00:00:00",
+          end: "2025-12-31 23:59:59",
+        });
+
+        // 重置表单
+        this.resetAcademicYearForm();
+
+        ElMessage.error("学年删除成功");
+
+        this.academicYearActionsVisible = false;
+        this.selectedAcademicAction = "";
+      } else {
+        ElMessage.error("无法删除不存在的学年");
+      }
+      this.selectedAcademicYear = "";
+      this.selectedAcademicYearIndex = null; // 如果适用,重置选中的学年索引
+    },
+    validateAcademicYearForm() {
+      return (
+        this.academicYearForm.name.trim() !== "" &&
+        this.academicYearForm.startDate &&
+        this.academicYearForm.endDate
+      );
+    },
+
+    resetAcademicYearForm() {
+      this.academicYearForm.name = "";
+      this.academicYearForm.startDate = "";
+      this.academicYearForm.endDate = "";
+    },
+
+    updateCalendarRange(range = {}) {
+      if (range.start && range.end) {
+        this.calendarOptions.validRange = {
+          start: range.start,
+          end: range.end,
+        };
+        if (this.calendar) {
+          this.calendar.setOption(
+            "validRange",
+            this.calendarOptions.validRange
+          );
+          this.calendar.render();
+        }
+      }
+    },
+
     // 文件上传成功
     uploadSuccess(data, a) {
       this.form.url = data.data[0];
@@ -330,7 +928,11 @@ export default {
         end: e.event.endStr,
       };
       editCalendarInfo(obj).then((response) => {
-        ElMessage.success("拖拽修改备注成功");
+        if ((response.data.status = 500)) {
+          ElMessage.error("没有权限,无法操作");
+        } else {
+          ElMessage.success("拖拽修改备注成功");
+        }
         // 更新数据
         this.InfoCalGet();
       });
@@ -384,7 +986,8 @@ export default {
       this.Visible = true;
     },
     // 确认添加备注事件   或者确认修改备注时间
-    confirm() {
+    confirm(a) {
+      console.log(a);
       if (this.form.name == null || this.form.name == "") {
         ElMessage.error("备注名称不能为空");
         return;
@@ -462,13 +1065,17 @@ export default {
           });
       }
       // 打开编辑备注框
-      else {
+      else if (value == "edit") {
         this.Visible = true;
         this.form.name = this.GetInfo.event.title;
         this.form.date = [
           this.GetInfo.event.startStr,
           this.GetInfo.event.endStr,
         ];
+      } else {
+        ElMessage.warning("复制数据");
+        this.chooseCopy = true;
+        this.form.name = this.GetInfo.event.title + "副本";
       }
     },
     // 获取备注数据
@@ -493,16 +1100,54 @@ export default {
         url: "",
       };
     },
+    certainCopy() {
+      var obj = {
+        title: this.form.name,
+        detail: this.form.desc,
+        start: this.form.date[0],
+        end: this.form.date[1],
+        overlap: 1,
+        editable: 1,
+        color: "#ffcc99",
+        file: "",
+        fileType: "",
+      };
+      addCalendarsInfo(obj).then(() => {
+        this.InfoCalGet();
+      }); // 更新数据
+      this.clearForm();
+      this.chooseCopy = false;
+    },
   },
 };
 </script>
 
 <style scoped>
-.calendar {
-  width: 70%;
-  height: 100%;
-  margin-left: 250px;
-  margin-top: 70px;
-  margin-bottom: 70px;
+.main {
+  margin: 30px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.content {
+  width: 1450px;
+}
+
+.term {
+  /* margin-top: 30px; */
+  margin-bottom: 30px;
+  display: flex;
+  justify-content: right;
+  align-items: end;
+  flex-direction: column;
+}
+
+.term_content {
+  margin-top: 10px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 350px;
 }
 </style>

+ 48 - 10
vue_project/src/components/indexHeader.vue

@@ -1,17 +1,55 @@
-<template>
-    <div class="index-header">
-        <el-input v-model="input1" style="width: 240px" size="large" placeholder="Please Input" :suffix-icon="Search" />
-    </div>
+<template >
+  <div class="container">
+    <input type="text" /><button><i class="iconfont iconsearch"></i></button>
+  </div>
 </template>
 
-<script lang="js" setup>
-import { ref } from 'vue'
-import { Search } from '@element-plus/icons-vue'
-const input1 = ref('')
+<script >
 </script>
 
 <style>
-.index-header {
-    margin-left: 1300px;
+@import url("../assets/css/iconfont.css");
+
+
+.container {
+  width: 50px;
+  height: 50px;
+  border-radius: 25px;
+  background-color: #409eff;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  transition: 1s;
+}
+.container input {
+  display: none;
+  width: 0px;
+  padding: 0;
+  font-size: 17px;
+  outline: none;
+  border: none;
+  background: transparent;
+  transition: 1s;
+}
+.container button {
+  border: none;
+  padding: 3px;
+  margin: 3px;
+  border-radius: 50%;
+  background-color: #409eff;
+}
+.container button i {
+  font: 900 20px "";
+  color: #fff;
+}
+
+.container:hover {
+  width: 290px;
+  border: 2px solid #409eff;
+  background-color: #fff;
+}
+.container:hover input {
+  display: inline-block;
+  width: 220px;
 }
 </style>

+ 20 - 16
vue_project/src/components/indexNav.vue

@@ -30,10 +30,10 @@
             </div>
             <div class="hidden sm:ml-6 sm:block">
               <div class="flex space-x-4">
-                <a
+                <router-link
+                  to="/home"
                   v-for="item in navigation"
                   :key="item.name"
-                  :href="item.href"
                   :class="[
                     item.current
                       ? 'bg-gray-900 text-white'
@@ -41,7 +41,7 @@
                     'rounded-md px-3 py-2 text-sm font-medium',
                   ]"
                   :aria-current="item.current ? 'page' : undefined"
-                  >{{ item.name }}</a
+                  >{{ item.name }}</router-link
                 >
               </div>
             </div>
@@ -91,7 +91,9 @@
                       <div
                         class="dropdown-menu-item flex items-center justify-between px-4 py-2"
                       >
-                        <div class="flex-1 text-center ml-2">{{ username }}</div>
+                        <div class="flex-1 text-center ml-2">
+                          {{ username }}
+                        </div>
                         <!-- 名字居中显示 -->
                         <button class="flex items-center justify-center ml-1">
                           <!-- 减少左边距 -->
@@ -110,7 +112,7 @@
                         >
                           <!-- 左侧文本和图标 -->
                           <div class="flex items-center">
-                            <span>电话号码:{{phone}}</span>
+                            <span>电话号码:{{ phone }}</span>
                           </div>
                         </button>
                       </div>
@@ -183,6 +185,8 @@ import { useUserInfoStore } from "@/stores/userInfo";
 import { useRouter } from "vue-router";
 import { ref, onMounted } from "vue";
 import pinia from "../stores/index";
+import { manLoginOut } from "../api/index";
+import { ElMessage } from 'element-plus';
 const userInfoStore = useUserInfoStore(pinia);
 const router = useRouter();
 // Initialization for ES Users
@@ -190,24 +194,24 @@ const username = ref("");
 const phone = ref("");
 const LogOut = () => {
   username.value = "";
-  userInfoStore.initUserInfo();
+  manLoginOut().then(
+    (response)=>{
+      userInfoStore.initUserInfo();
+    }
+  )
   router.push({ path: "/home" });
 };
 
 const navigation = [
-  { name: "Dashboard", href: "#", current: false },
-  { name: "Team", href: "#", current: false },
-  { name: "Projects", href: "#", current: false },
-  { name: "Calendar", href: "#", current: true },
+  { name: "首页", current: false },
+  { name: "Calendar", current: true },
 ];
 
 onMounted(() => {
-      userInfoStore.getInfo().then(
-      (response) => {
-        username.value = userInfoStore.username;
-        phone.value = userInfoStore.phone;
-      }
-    );
+  userInfoStore.getInfo().then((response) => {
+    username.value = userInfoStore.username;
+    phone.value = userInfoStore.phone;
+  });
 });
 </script>
 

+ 10 - 1
vue_project/src/router/index.js

@@ -12,6 +12,15 @@ const router = createRouter({
 router.beforeEach((to, from, next) => {
   const TokenKey = 'vue_admin_template_token'
   const token = Cookies.get(TokenKey)
+  if(to.name == "Login"){
+    if(token){
+      ElMessage.error("已经登录,请勿重新登录")
+      next("/index")
+    }
+    else{
+      next()
+    }
+  }
   if (to.meta.isAuth) {
     if (token) {
       next()
@@ -25,7 +34,7 @@ router.beforeEach((to, from, next) => {
   }
   if (to.matched.length === 0) {
     ElMessage.error("无效页面,自动返回首页")
-    next("/index")
+    next("/home")
   }
   next()
 });

+ 0 - 7
vue_project/src/router/router.js

@@ -17,13 +17,6 @@ export const staticRoutes = [
       meta:{isAuth:true}
     },
     {
-      //用户日历主页
-      path:"/userIndex",
-      component: () => import("../components/index.vue"),
-      name: "userIndex",
-      meta:{isAuth:true}
-    },
-    {
       // 登录
       path: "/login",
       component: () => import("../components/LoginForm.vue"),

+ 7 - 3
vue_project/src/utils/request.js

@@ -9,14 +9,14 @@ import Cookies from 'js-cookie'
 const service = axios.create({
   baseURL: "/api",
   // 超时时间 单位是ms,这里设置了3s的超时时间
-  timeout: 3 * 1000
+  timeout: 10 * 1000
 })
 
 // 请求拦截器
 service.interceptors.request.use(config => {
   const TokenKey = 'vue_admin_template_token'
   const token = Cookies.get(TokenKey)
-  if (token && typeof token !='undefined' && token != "") {
+  if (token && typeof token != 'undefined' && token != "") {
     // 管理员
     (config.headers)['Authorization'] = "Bearer " + token
     // 学生 (config.headers)['Authorization'] = "Bearer " + token
@@ -31,6 +31,7 @@ service.interceptors.response.use(
   function (response) {
     if (response.data.code !== 200) {
       // 判断响应状态码
+      if (response.status == 500) return Promise.reject(ElMessage.error("无操作权限"))
       if (response.data.code == 501) return Promise.reject(ElMessage.error("用户名有误"))
       else if (response.data.code == 503) return Promise.reject(ElMessage.error("密码有误"))
       else if (response.data.code == 504) return Promise.reject(ElMessage.error("登录已过期"))
@@ -41,7 +42,10 @@ service.interceptors.response.use(
     return response;
   },
   function (error) {
-    if(error.response.status == 500) return Promise.reject(ElMessage.error("服务器报错"))
+    if (error.response.status == 500) return Promise.reject(ElMessage.error("服务器报错"))
+    if (error.response.data.status == 500) {
+      return Promise.reject(ElMessage.error("无操作权限非法访问"))
+    }
   });
 
 

Some files were not shown because too many files changed in this diff