diff --git a/.idea/New-JW.iml b/.idea/New-JW.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/New-JW.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..807b4678 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..0831f54a --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,15 @@ + + + + + 9fcb59ee-b3c5-470d-89df-ad01e7cabb15 + true + true + $PROJECT_DIR$/backend/roomroot-admin/src/main/resources/application-druid.yml + false + dm.jdbc.driver.DmDriver + jdbc:dm://10.1.1.17:5236?schema=JIAOWU&useUnicode=true&characterEncoding=utf-8 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..c0b2ec41 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..3b522d84 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..eb061bc9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..4c46f6a3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 00000000..46d9b2d0 --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.reasonix/attachments/clipboard-20260821-112211.570729-000001.png b/.reasonix/attachments/clipboard-20260821-112211.570729-000001.png new file mode 100644 index 00000000..6fae9b59 Binary files /dev/null and b/.reasonix/attachments/clipboard-20260821-112211.570729-000001.png differ diff --git a/.reasonix/desktop-topic-auto-title-meta.json b/.reasonix/desktop-topic-auto-title-meta.json new file mode 100644 index 00000000..67930fe7 --- /dev/null +++ b/.reasonix/desktop-topic-auto-title-meta.json @@ -0,0 +1,8 @@ +{ + "topic_20260818-025043_e469238a6cc39459": { + "stage": 3, + "userTurns": 3, + "basisHash": "ab28583a1084bba5", + "updatedAt": 1787024624634 + } +} \ No newline at end of file diff --git a/.reasonix/desktop-topic-created-at.json b/.reasonix/desktop-topic-created-at.json new file mode 100644 index 00000000..b35bda74 --- /dev/null +++ b/.reasonix/desktop-topic-created-at.json @@ -0,0 +1,3 @@ +{ + "topic_20260818-025043_e469238a6cc39459": 1787021443129 +} \ No newline at end of file diff --git a/.reasonix/desktop-topic-title-sources.json b/.reasonix/desktop-topic-title-sources.json new file mode 100644 index 00000000..8e483075 --- /dev/null +++ b/.reasonix/desktop-topic-title-sources.json @@ -0,0 +1,3 @@ +{ + "topic_20260818-025043_e469238a6cc39459": "auto" +} \ No newline at end of file diff --git a/.reasonix/desktop-topic-titles.json b/.reasonix/desktop-topic-titles.json new file mode 100644 index 00000000..b0698403 --- /dev/null +++ b/.reasonix/desktop-topic-titles.json @@ -0,0 +1,3 @@ +{ + "topic_20260818-025043_e469238a6cc39459": "在JYSController中,教研…" +} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-1/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-1/events.jsonl new file mode 100644 index 00000000..1d3efde7 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-1/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T11:50:58.8315719+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-1","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T11:51:29.838828+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-1","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-1/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-1/snapshot.json new file mode 100644 index 00000000..8e678aea --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-1/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-1","job_id":"bash-1","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":8,"created_at":"2026-08-18T11:50:58.8315719+08:00","updated_at":"2026-08-18T11:51:29.838828+08:00"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-1/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-1/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-2/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-2/events.jsonl new file mode 100644 index 00000000..a854545a --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-2/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T11:52:59.6491318+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-2","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T11:53:12.5470012+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-2","session_id":"20260818-025043.151598500-session","state":"failed","runtime_state":"exited","error_code":"job_failed"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-2/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-2/snapshot.json new file mode 100644 index 00000000..43e1e839 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-2/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-2","job_id":"bash-2","session_id":"20260818-025043.151598500-session","state":"failed","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":4,"created_at":"2026-08-18T11:52:59.6491318+08:00","updated_at":"2026-08-18T11:53:12.5470012+08:00","error_code":"job_failed"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-2/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-2/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-3/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-3/events.jsonl new file mode 100644 index 00000000..911e58bb --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-3/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T11:55:22.4260602+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-3","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T11:55:48.4568907+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-3","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-3/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-3/snapshot.json new file mode 100644 index 00000000..72edb93e --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-3/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-3","job_id":"bash-3","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":7,"created_at":"2026-08-18T11:55:22.4260602+08:00","updated_at":"2026-08-18T11:55:48.4568907+08:00"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-3/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-3/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-4/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-4/events.jsonl new file mode 100644 index 00000000..4956dab6 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-4/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T11:56:26.9971307+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-4","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T11:57:42.5597432+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-4","session_id":"20260818-025043.151598500-session","state":"cancelled","runtime_state":"exited","error_code":"job_failed"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-4/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-4/snapshot.json new file mode 100644 index 00000000..a2f5cd79 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-4/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-4","job_id":"bash-4","session_id":"20260818-025043.151598500-session","state":"cancelled","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":17,"created_at":"2026-08-18T11:56:26.9971307+08:00","updated_at":"2026-08-18T11:57:42.5597432+08:00","error_code":"job_failed"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-4/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-4/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-5/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-5/events.jsonl new file mode 100644 index 00000000..27cb4b29 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-5/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T15:59:13.8456942+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-5","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T15:59:39.9995233+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-5","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-5/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-5/snapshot.json new file mode 100644 index 00000000..b5fc2e4b --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-5/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-5","job_id":"bash-5","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":7,"created_at":"2026-08-18T15:59:13.8456942+08:00","updated_at":"2026-08-18T15:59:39.9995233+08:00"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-5/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-5/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-6/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-6/events.jsonl new file mode 100644 index 00000000..65ebf53b --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-6/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-18T15:59:54.7700222+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-6","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-18T16:01:27.1609364+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-6","session_id":"20260818-025043.151598500-session","state":"cancelled","runtime_state":"exited","error_code":"job_failed"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-6/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-6/snapshot.json new file mode 100644 index 00000000..b05e2258 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-6/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-6","job_id":"bash-6","session_id":"20260818-025043.151598500-session","state":"cancelled","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":20,"created_at":"2026-08-18T15:59:54.7700222+08:00","updated_at":"2026-08-18T16:01:27.1609364+08:00","error_code":"job_failed"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-6/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-6/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-7/events.jsonl b/.reasonix/tasks/20260818-025043.151598500-session--bash-7/events.jsonl new file mode 100644 index 00000000..29870feb --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-7/events.jsonl @@ -0,0 +1,2 @@ +{"sequence":1,"timestamp":"2026-08-20T10:07:19.1030303+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-7","session_id":"20260818-025043.151598500-session","state":"running","runtime_state":"alive"} +{"sequence":2,"timestamp":"2026-08-20T10:08:07.4924999+08:00","event_type":"state_change","task_id":"20260818-025043.151598500-session--bash-7","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited"} diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-7/snapshot.json b/.reasonix/tasks/20260818-025043.151598500-session--bash-7/snapshot.json new file mode 100644 index 00000000..e21998c2 --- /dev/null +++ b/.reasonix/tasks/20260818-025043.151598500-session--bash-7/snapshot.json @@ -0,0 +1 @@ +{"schema_version":1,"task_id":"20260818-025043.151598500-session--bash-7","job_id":"bash-7","session_id":"20260818-025043.151598500-session","state":"succeeded","runtime_state":"exited","runtime_lease_until":"0001-01-01T00:00:00Z","version":11,"created_at":"2026-08-20T10:07:19.1030303+08:00","updated_at":"2026-08-20T10:08:07.4924999+08:00"} \ No newline at end of file diff --git a/.reasonix/tasks/20260818-025043.151598500-session--bash-7/task.lock b/.reasonix/tasks/20260818-025043.151598500-session--bash-7/task.lock new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..d90622c4 --- /dev/null +++ b/backend/roomroot-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,67 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\EmbeddedRedisConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\RoomRootApplication.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\RoomRootServletInitializer.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\common\CaptchaController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\common\CommonController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\AccountManagementController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\AffiliationSettingController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\BuildController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\BZLBController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ClassRoomCalendarController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ClassRoomController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ClassRoomLessonController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ClassSemesterCalendarController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\CourseRunningController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\CourseTeachingController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DepartmentManagementController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DepartmentPersonnelController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DictDataController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DictTypeController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DisciplineManagementController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\DownloadController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ElectiveController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\FacultyController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\JYSController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\KCBController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\KSController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\LeaveController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\LogController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\NoticeAnnouncementController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\NotificationLogController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\OfficeTaskBookController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\OperationLogController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\SemesterCalendarController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\SemesterController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\StudentRecordsController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\StudentTeamOutputScheduleController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\StudentTeamTaskController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\SystemInitializationController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TeachingMaterialController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TeachingPlanController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TeachingStockController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TeachingStockDetailController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TeachingTaskController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TimetableConflictController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\TrainingProgramController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\jwgl\ZYJXJHBController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\monitor\CacheController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\monitor\ServerController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\monitor\SysLogininforController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\monitor\SysOperlogController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\monitor\SysUserOnlineController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysConfigController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysDeptController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysDictDataController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysDictTypeController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysIndexController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysLoginController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysMenuController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysNoticeController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysPostController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysProfileController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysRegisterController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysRoleController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\system\SysUserController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\controller\tool\TestController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\core\config\EmbeddedRedisCondition.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\src\main\java\com\roomroot\web\core\config\SwaggerConfig.java diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Anonymous.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Anonymous.class new file mode 100644 index 00000000..e3c24741 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Anonymous.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataScope.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataScope.class new file mode 100644 index 00000000..d2f565a1 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataScope.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataSource.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataSource.class new file mode 100644 index 00000000..2ad253f8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/DataSource.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$ColumnType.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$ColumnType.class new file mode 100644 index 00000000..8933808d Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$ColumnType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$Type.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$Type.class new file mode 100644 index 00000000..cb41fc1a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel$Type.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel.class new file mode 100644 index 00000000..b04882b6 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excel.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excels.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excels.class new file mode 100644 index 00000000..6ef48f23 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Excels.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Log.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Log.class new file mode 100644 index 00000000..bfdfadcb Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Log.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RateLimiter.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RateLimiter.class new file mode 100644 index 00000000..e9fbc624 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RateLimiter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RepeatSubmit.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RepeatSubmit.class new file mode 100644 index 00000000..196427f4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/RepeatSubmit.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Sensitive.class b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Sensitive.class new file mode 100644 index 00000000..0dc04838 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/annotation/Sensitive.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/config/RoomRootConfig.class b/backend/roomroot-common/target/classes/com/roomroot/common/config/RoomRootConfig.class new file mode 100644 index 00000000..a807d34a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/config/RoomRootConfig.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/config/serializer/SensitiveJsonSerializer.class b/backend/roomroot-common/target/classes/com/roomroot/common/config/serializer/SensitiveJsonSerializer.class new file mode 100644 index 00000000..747fdc08 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/config/serializer/SensitiveJsonSerializer.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/CacheConstants.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/CacheConstants.class new file mode 100644 index 00000000..5b869217 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/CacheConstants.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants$Dept.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants$Dept.class new file mode 100644 index 00000000..43790e12 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants$Dept.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants.class new file mode 100644 index 00000000..5c106aca Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/Constants.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/GenConstants.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/GenConstants.class new file mode 100644 index 00000000..3eddbb66 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/GenConstants.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/HttpStatus.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/HttpStatus.class new file mode 100644 index 00000000..bdd9ffa3 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/HttpStatus.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants$Status.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants$Status.class new file mode 100644 index 00000000..57dcaeb9 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants$Status.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants.class new file mode 100644 index 00000000..3f4f9c31 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/ScheduleConstants.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/constant/UserConstants.class b/backend/roomroot-common/target/classes/com/roomroot/common/constant/UserConstants.class new file mode 100644 index 00000000..cbe95d8f Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/constant/UserConstants.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController$1.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController$1.class new file mode 100644 index 00000000..ba75c127 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController$1.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController.class new file mode 100644 index 00000000..4f6d2e8e Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/controller/BaseController.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/AjaxResult.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/AjaxResult.class new file mode 100644 index 00000000..bd3ce331 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/AjaxResult.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/BaseEntity.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/BaseEntity.class new file mode 100644 index 00000000..92a725ee Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/BaseEntity.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/R.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/R.class new file mode 100644 index 00000000..97815fa0 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/R.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeEntity.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeEntity.class new file mode 100644 index 00000000..d2472da2 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeEntity.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeSelect.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeSelect.class new file mode 100644 index 00000000..fdc8a882 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/TreeSelect.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDept.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDept.class new file mode 100644 index 00000000..9965e3b3 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDept.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictData.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictData.class new file mode 100644 index 00000000..003b5c68 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictData.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictType.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictType.class new file mode 100644 index 00000000..b2180a50 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysDictType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysMenu.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysMenu.class new file mode 100644 index 00000000..9fcf19f4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysMenu.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysRole.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysRole.class new file mode 100644 index 00000000..6880681a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysRole.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysUser.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysUser.class new file mode 100644 index 00000000..b6096006 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/SysUser.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClass.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClass.class new file mode 100644 index 00000000..d60b018b Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClass.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClassReport.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClassReport.class new file mode 100644 index 00000000..e51d3218 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxClassReport.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxCourse.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxCourse.class new file mode 100644 index 00000000..59435560 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxCourse.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJspxCourse.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJspxCourse.class new file mode 100644 index 00000000..b884545a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJspxCourse.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJxkcDocument.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJxkcDocument.class new file mode 100644 index 00000000..9b4bc4b1 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxJxkcDocument.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxMyCourse.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxMyCourse.class new file mode 100644 index 00000000..b66aba48 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxMyCourse.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxSchool.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxSchool.class new file mode 100644 index 00000000..731b5ad6 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxSchool.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxTszlFile.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxTszlFile.class new file mode 100644 index 00000000..99bb5dce Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxTszlFile.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxYxpxCourse.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxYxpxCourse.class new file mode 100644 index 00000000..66026fd4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/entity/ZhjxYxpxCourse.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginBody.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginBody.class new file mode 100644 index 00000000..91ff236c Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginBody.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginUser.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginUser.class new file mode 100644 index 00000000..75aaa768 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/LoginUser.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/RegisterBody.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/RegisterBody.class new file mode 100644 index 00000000..f67f4ab3 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/domain/model/RegisterBody.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/page/PageDomain.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/PageDomain.class new file mode 100644 index 00000000..9c88c640 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/PageDomain.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableDataInfo.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableDataInfo.class new file mode 100644 index 00000000..8503fb1b Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableDataInfo.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableSupport.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableSupport.class new file mode 100644 index 00000000..edfc6e25 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/page/TableSupport.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/redis/RedisCache.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/redis/RedisCache.class new file mode 100644 index 00000000..a5de7cb8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/redis/RedisCache.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/text/CharsetKit.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/CharsetKit.class new file mode 100644 index 00000000..bf059db3 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/CharsetKit.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/text/Convert.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/Convert.class new file mode 100644 index 00000000..51bf359a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/Convert.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/core/text/StrFormatter.class b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/StrFormatter.class new file mode 100644 index 00000000..35d6f1c2 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/core/text/StrFormatter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessStatus.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessStatus.class new file mode 100644 index 00000000..0fd3cef8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessStatus.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessType.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessType.class new file mode 100644 index 00000000..a450c46f Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/BusinessType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/DataSourceType.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/DataSourceType.class new file mode 100644 index 00000000..8dcddc1b Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/DataSourceType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/DesensitizedType.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/DesensitizedType.class new file mode 100644 index 00000000..06e6ed55 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/DesensitizedType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/HttpMethod.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/HttpMethod.class new file mode 100644 index 00000000..335af4ce Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/HttpMethod.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/LimitType.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/LimitType.class new file mode 100644 index 00000000..722a1148 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/LimitType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/OperatorType.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/OperatorType.class new file mode 100644 index 00000000..9a13df47 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/OperatorType.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/enums/UserStatus.class b/backend/roomroot-common/target/classes/com/roomroot/common/enums/UserStatus.class new file mode 100644 index 00000000..8582365e Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/enums/UserStatus.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/DemoModeException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/DemoModeException.class new file mode 100644 index 00000000..ed5fb92a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/DemoModeException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/GlobalException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/GlobalException.class new file mode 100644 index 00000000..f13c700a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/GlobalException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/ServiceException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/ServiceException.class new file mode 100644 index 00000000..c40587aa Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/ServiceException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/UtilException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/UtilException.class new file mode 100644 index 00000000..81dbcc85 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/UtilException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/base/BaseException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/base/BaseException.class new file mode 100644 index 00000000..cf7c01e1 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/base/BaseException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileException.class new file mode 100644 index 00000000..fd12aa76 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileNameLengthLimitExceededException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileNameLengthLimitExceededException.class new file mode 100644 index 00000000..8d44e2b2 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileNameLengthLimitExceededException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileSizeLimitExceededException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileSizeLimitExceededException.class new file mode 100644 index 00000000..56c8cef4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileSizeLimitExceededException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileUploadException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileUploadException.class new file mode 100644 index 00000000..2b74a5ae Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/FileUploadException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class new file mode 100644 index 00000000..09427ea4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidFlashExtensionException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class new file mode 100644 index 00000000..9b5512a8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidImageExtensionException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class new file mode 100644 index 00000000..ff87522e Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidMediaExtensionException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class new file mode 100644 index 00000000..6da2ebf1 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException$InvalidVideoExtensionException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException.class new file mode 100644 index 00000000..427cf63a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/file/InvalidExtensionException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException$Code.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException$Code.class new file mode 100644 index 00000000..1006adbb Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException$Code.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException.class new file mode 100644 index 00000000..dfd7c5f2 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/job/TaskException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/BlackListException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/BlackListException.class new file mode 100644 index 00000000..c61b2b65 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/BlackListException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaException.class new file mode 100644 index 00000000..4a296661 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaExpireException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaExpireException.class new file mode 100644 index 00000000..dbb99382 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/CaptchaExpireException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserException.class new file mode 100644 index 00000000..c95e40d8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserNotExistsException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserNotExistsException.class new file mode 100644 index 00000000..d96a73cc Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserNotExistsException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordNotMatchException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordNotMatchException.class new file mode 100644 index 00000000..cae85f77 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordNotMatchException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordRetryLimitExceedException.class b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordRetryLimitExceedException.class new file mode 100644 index 00000000..c81ea991 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/exception/user/UserPasswordRetryLimitExceedException.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/PropertyPreExcludeFilter.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/PropertyPreExcludeFilter.class new file mode 100644 index 00000000..76b517a5 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/PropertyPreExcludeFilter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/RefererFilter.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RefererFilter.class new file mode 100644 index 00000000..98d91d09 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RefererFilter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatableFilter.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatableFilter.class new file mode 100644 index 00000000..40cdf9b0 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatableFilter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper$1.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper$1.class new file mode 100644 index 00000000..3237b59d Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper$1.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper.class new file mode 100644 index 00000000..553bc90f Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/RepeatedlyRequestWrapper.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssFilter.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssFilter.class new file mode 100644 index 00000000..4d5d500f Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssFilter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper$1.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper$1.class new file mode 100644 index 00000000..e2d1d85a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper$1.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper.class b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper.class new file mode 100644 index 00000000..cf435698 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/filter/XssHttpServletRequestWrapper.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/Arith.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/Arith.class new file mode 100644 index 00000000..b9adc000 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/Arith.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/DateUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DateUtils.class new file mode 100644 index 00000000..f08914f6 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DateUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/DbTypeUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DbTypeUtil.class new file mode 100644 index 00000000..6c8a9696 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DbTypeUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/DesensitizedUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DesensitizedUtil.class new file mode 100644 index 00000000..4fff29ec Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DesensitizedUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/DictUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DictUtils.class new file mode 100644 index 00000000..8d7d0603 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/DictUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/ExceptionUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ExceptionUtil.class new file mode 100644 index 00000000..6e332d95 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ExceptionUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/LogUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/LogUtils.class new file mode 100644 index 00000000..94e162c0 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/LogUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/MessageUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/MessageUtils.class new file mode 100644 index 00000000..769bc711 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/MessageUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/PageUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/PageUtils.class new file mode 100644 index 00000000..491e2912 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/PageUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/SecurityUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/SecurityUtils.class new file mode 100644 index 00000000..1606e1c2 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/SecurityUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/ServletUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ServletUtils.class new file mode 100644 index 00000000..96cbfe01 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ServletUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/StringUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/StringUtils.class new file mode 100644 index 00000000..fa291e3e Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/StringUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/Threads.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/Threads.class new file mode 100644 index 00000000..47a19b11 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/Threads.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanUtils.class new file mode 100644 index 00000000..36d90102 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanValidators.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanValidators.class new file mode 100644 index 00000000..5ce80fdb Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/bean/BeanValidators.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileTypeUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileTypeUtils.class new file mode 100644 index 00000000..7cb2e04c Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileTypeUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUploadUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUploadUtils.class new file mode 100644 index 00000000..9d59fa9a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUploadUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUtils.class new file mode 100644 index 00000000..d4488e45 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/FileUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/ImageUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/ImageUtils.class new file mode 100644 index 00000000..3dd3080c Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/ImageUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/MimeTypeUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/MimeTypeUtils.class new file mode 100644 index 00000000..1a9b3c35 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/file/MimeTypeUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/EscapeUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/EscapeUtil.class new file mode 100644 index 00000000..6f764cdd Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/EscapeUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/HTMLFilter.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/HTMLFilter.class new file mode 100644 index 00000000..1d258eaa Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/html/HTMLFilter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpHelper.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpHelper.class new file mode 100644 index 00000000..91c34c79 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpHelper.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class new file mode 100644 index 00000000..cb069133 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyHostnameVerifier.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyTrustManager.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyTrustManager.class new file mode 100644 index 00000000..593dc72a Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils$TrustAnyTrustManager.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils.class new file mode 100644 index 00000000..54d1f176 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/HttpUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/UserAgentUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/UserAgentUtils.class new file mode 100644 index 00000000..333dbb19 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/http/UserAgentUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/AddressUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/AddressUtils.class new file mode 100644 index 00000000..b9dc6101 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/AddressUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/IpUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/IpUtils.class new file mode 100644 index 00000000..0b9bdf6c Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/ip/IpUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelHandlerAdapter.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelHandlerAdapter.class new file mode 100644 index 00000000..790f7dd4 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelHandlerAdapter.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelSheet.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelSheet.class new file mode 100644 index 00000000..10c8c4fb Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelSheet.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelUtil.class new file mode 100644 index 00000000..d636f50d Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/poi/ExcelUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/reflect/ReflectUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/reflect/ReflectUtils.class new file mode 100644 index 00000000..84b20eff Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/reflect/ReflectUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Base64.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Base64.class new file mode 100644 index 00000000..2926ef7f Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Base64.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Md5Utils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Md5Utils.class new file mode 100644 index 00000000..faa46914 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sign/Md5Utils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/spring/SpringUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/spring/SpringUtils.class new file mode 100644 index 00000000..25a5a692 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/spring/SpringUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/sql/SqlUtil.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sql/SqlUtil.class new file mode 100644 index 00000000..7edc7509 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/sql/SqlUtil.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/IdUtils.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/IdUtils.class new file mode 100644 index 00000000..9aef3fb9 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/IdUtils.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/Seq.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/Seq.class new file mode 100644 index 00000000..5127528d Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/Seq.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID$Holder.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID$Holder.class new file mode 100644 index 00000000..bb0c8fa7 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID$Holder.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID.class b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID.class new file mode 100644 index 00000000..310285f8 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/utils/uuid/UUID.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/xss/Xss.class b/backend/roomroot-common/target/classes/com/roomroot/common/xss/Xss.class new file mode 100644 index 00000000..f0433371 Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/xss/Xss.class differ diff --git a/backend/roomroot-common/target/classes/com/roomroot/common/xss/XssValidator.class b/backend/roomroot-common/target/classes/com/roomroot/common/xss/XssValidator.class new file mode 100644 index 00000000..cb66f4cd Binary files /dev/null and b/backend/roomroot-common/target/classes/com/roomroot/common/xss/XssValidator.class differ diff --git a/backend/roomroot-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..17f90e25 --- /dev/null +++ b/backend/roomroot-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,120 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\Anonymous.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\DataScope.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\DataSource.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\Excel.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\Excels.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\Log.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\RateLimiter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\RepeatSubmit.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\annotation\Sensitive.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\config\RoomRootConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\config\serializer\SensitiveJsonSerializer.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\CacheConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\Constants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\GenConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\HttpStatus.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\ScheduleConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\constant\UserConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\controller\BaseController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\AjaxResult.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\BaseEntity.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysDept.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysDictData.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysDictType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysMenu.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysRole.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\SysUser.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxClass.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxClassReport.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxCourse.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxJspxCourse.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxJxkcDocument.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxMyCourse.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxSchool.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxTszlFile.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\entity\ZhjxYxpxCourse.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\model\LoginBody.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\model\LoginUser.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\model\RegisterBody.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\R.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\TreeEntity.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\domain\TreeSelect.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\page\PageDomain.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\page\TableDataInfo.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\page\TableSupport.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\redis\RedisCache.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\text\CharsetKit.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\text\Convert.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\core\text\StrFormatter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\BusinessStatus.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\BusinessType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\DataSourceType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\DesensitizedType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\HttpMethod.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\LimitType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\OperatorType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\enums\UserStatus.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\base\BaseException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\DemoModeException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\file\FileException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\file\FileNameLengthLimitExceededException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\file\FileSizeLimitExceededException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\file\FileUploadException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\file\InvalidExtensionException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\GlobalException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\job\TaskException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\ServiceException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\BlackListException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\CaptchaException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\CaptchaExpireException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\UserException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\UserNotExistsException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\UserPasswordNotMatchException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\user\UserPasswordRetryLimitExceedException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\exception\UtilException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\PropertyPreExcludeFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\RefererFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\RepeatableFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\RepeatedlyRequestWrapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\XssFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\filter\XssHttpServletRequestWrapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\Arith.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\bean\BeanUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\bean\BeanValidators.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\DateUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\DbTypeUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\DesensitizedUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\DictUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\ExceptionUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\file\FileTypeUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\file\FileUploadUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\file\FileUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\file\ImageUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\file\MimeTypeUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\html\EscapeUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\html\HTMLFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\http\HttpHelper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\http\HttpUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\http\UserAgentUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\ip\AddressUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\ip\IpUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\LogUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\MessageUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\PageUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\poi\ExcelHandlerAdapter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\poi\ExcelSheet.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\poi\ExcelUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\reflect\ReflectUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\SecurityUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\ServletUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\sign\Base64.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\sign\Md5Utils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\spring\SpringUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\sql\SqlUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\StringUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\Threads.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\uuid\IdUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\uuid\Seq.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\utils\uuid\UUID.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\xss\Xss.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-common\src\main\java\com\roomroot\common\xss\XssValidator.java diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataScopeAspect.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataScopeAspect.class new file mode 100644 index 00000000..486e9150 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataScopeAspect.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataSourceAspect.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataSourceAspect.class new file mode 100644 index 00000000..7bcb89fc Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/DataSourceAspect.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/LogAspect.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/LogAspect.class new file mode 100644 index 00000000..3b9ef88e Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/LogAspect.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/RateLimiterAspect.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/RateLimiterAspect.class new file mode 100644 index 00000000..7e4842ea Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/aspectj/RateLimiterAspect.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ApplicationConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ApplicationConfig.class new file mode 100644 index 00000000..a2477bdc Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ApplicationConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/CaptchaConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/CaptchaConfig.class new file mode 100644 index 00000000..9e6acb10 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/CaptchaConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig$1.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig$1.class new file mode 100644 index 00000000..1c7f38f1 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig$1.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig.class new file mode 100644 index 00000000..3de4b1bd Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/DruidConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FastJson2JsonRedisSerializer.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FastJson2JsonRedisSerializer.class new file mode 100644 index 00000000..1f834606 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FastJson2JsonRedisSerializer.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FilterConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FilterConfig.class new file mode 100644 index 00000000..a0cf3ba3 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/FilterConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/I18nConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/I18nConfig.class new file mode 100644 index 00000000..23d97a56 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/I18nConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/KaptchaTextCreator.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/KaptchaTextCreator.class new file mode 100644 index 00000000..30b1fa2e Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/KaptchaTextCreator.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/MyBatisConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/MyBatisConfig.class new file mode 100644 index 00000000..97e4067a Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/MyBatisConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/RedisConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/RedisConfig.class new file mode 100644 index 00000000..4ab3359b Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/RedisConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ResourcesConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ResourcesConfig.class new file mode 100644 index 00000000..6bcdf524 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ResourcesConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/SecurityConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/SecurityConfig.class new file mode 100644 index 00000000..c1b1df00 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/SecurityConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ServerConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ServerConfig.class new file mode 100644 index 00000000..2dc29bc4 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ServerConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig$1.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig$1.class new file mode 100644 index 00000000..6476c974 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig$1.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig.class new file mode 100644 index 00000000..4e752752 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/ThreadPoolConfig.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/DruidProperties.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/DruidProperties.class new file mode 100644 index 00000000..a77ffeb8 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/DruidProperties.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/PermitAllUrlProperties.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/PermitAllUrlProperties.class new file mode 100644 index 00000000..8feceb9e Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/config/properties/PermitAllUrlProperties.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSource.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSource.class new file mode 100644 index 00000000..50c41f07 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSource.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSourceContextHolder.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSourceContextHolder.class new file mode 100644 index 00000000..0647ac34 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/datasource/DynamicDataSourceContextHolder.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/RepeatSubmitInterceptor.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/RepeatSubmitInterceptor.class new file mode 100644 index 00000000..650ba98b Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/RepeatSubmitInterceptor.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/impl/SameUrlDataInterceptor.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/impl/SameUrlDataInterceptor.class new file mode 100644 index 00000000..c7f2a44f Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/interceptor/impl/SameUrlDataInterceptor.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/AsyncManager.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/AsyncManager.class new file mode 100644 index 00000000..0826e916 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/AsyncManager.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/ShutdownManager.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/ShutdownManager.class new file mode 100644 index 00000000..a85f53a1 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/ShutdownManager.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$1.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$1.class new file mode 100644 index 00000000..009d8f83 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$1.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$2.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$2.class new file mode 100644 index 00000000..2ded36f2 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory$2.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory.class new file mode 100644 index 00000000..f37c1043 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/manager/factory/AsyncFactory.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/AuthenticationContextHolder.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/AuthenticationContextHolder.class new file mode 100644 index 00000000..50af41b4 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/AuthenticationContextHolder.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/PermissionContextHolder.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/PermissionContextHolder.class new file mode 100644 index 00000000..d27e9bd5 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/context/PermissionContextHolder.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/security/filter/JwtAuthenticationTokenFilter.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/filter/JwtAuthenticationTokenFilter.class new file mode 100644 index 00000000..9b761d20 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/filter/JwtAuthenticationTokenFilter.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/AuthenticationEntryPointImpl.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/AuthenticationEntryPointImpl.class new file mode 100644 index 00000000..74a3fc6e Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/AuthenticationEntryPointImpl.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/LogoutSuccessHandlerImpl.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/LogoutSuccessHandlerImpl.class new file mode 100644 index 00000000..2c948125 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/security/handle/LogoutSuccessHandlerImpl.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/Server.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/Server.class new file mode 100644 index 00000000..064c8851 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/Server.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Cpu.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Cpu.class new file mode 100644 index 00000000..eb993131 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Cpu.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Jvm.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Jvm.class new file mode 100644 index 00000000..e9b94c36 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Jvm.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Mem.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Mem.class new file mode 100644 index 00000000..801cf521 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Mem.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Sys.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Sys.class new file mode 100644 index 00000000..5463a2eb Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/Sys.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/SysFile.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/SysFile.class new file mode 100644 index 00000000..dad09bcb Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/domain/server/SysFile.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/exception/GlobalExceptionHandler.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/exception/GlobalExceptionHandler.class new file mode 100644 index 00000000..8e8005e7 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/exception/GlobalExceptionHandler.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/PermissionService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/PermissionService.class new file mode 100644 index 00000000..e2bd1506 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/PermissionService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysLoginService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysLoginService.class new file mode 100644 index 00000000..fb776526 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysLoginService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPasswordService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPasswordService.class new file mode 100644 index 00000000..012254eb Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPasswordService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPermissionService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPermissionService.class new file mode 100644 index 00000000..c1fe84e8 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysPermissionService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysRegisterService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysRegisterService.class new file mode 100644 index 00000000..28e4bc81 Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/SysRegisterService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/TokenService.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/TokenService.class new file mode 100644 index 00000000..4bb5cc8f Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/TokenService.class differ diff --git a/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/UserDetailsServiceImpl.class b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/UserDetailsServiceImpl.class new file mode 100644 index 00000000..5e12c59f Binary files /dev/null and b/backend/roomroot-framework/target/classes/com/roomroot/framework/web/service/UserDetailsServiceImpl.class differ diff --git a/backend/roomroot-framework/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-framework/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-framework/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-framework/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..53727573 --- /dev/null +++ b/backend/roomroot-framework/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,45 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\aspectj\DataScopeAspect.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\aspectj\DataSourceAspect.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\aspectj\LogAspect.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\aspectj\RateLimiterAspect.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\ApplicationConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\CaptchaConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\DruidConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\FastJson2JsonRedisSerializer.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\FilterConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\I18nConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\KaptchaTextCreator.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\MyBatisConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\properties\DruidProperties.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\properties\PermitAllUrlProperties.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\RedisConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\ResourcesConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\SecurityConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\ServerConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\config\ThreadPoolConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\datasource\DynamicDataSource.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\datasource\DynamicDataSourceContextHolder.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\interceptor\impl\SameUrlDataInterceptor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\interceptor\RepeatSubmitInterceptor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\manager\AsyncManager.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\manager\factory\AsyncFactory.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\manager\ShutdownManager.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\security\context\AuthenticationContextHolder.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\security\context\PermissionContextHolder.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\security\filter\JwtAuthenticationTokenFilter.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\security\handle\AuthenticationEntryPointImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\security\handle\LogoutSuccessHandlerImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\Server.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\server\Cpu.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\server\Jvm.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\server\Mem.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\server\Sys.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\domain\server\SysFile.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\exception\GlobalExceptionHandler.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\PermissionService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\SysLoginService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\SysPasswordService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\SysPermissionService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\SysRegisterService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\TokenService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-framework\src\main\java\com\roomroot\framework\web\service\UserDetailsServiceImpl.java diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/config/GenConfig.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/config/GenConfig.class new file mode 100644 index 00000000..4a91fd9f Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/config/GenConfig.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/controller/GenController.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/controller/GenController.class new file mode 100644 index 00000000..6f27e098 Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/controller/GenController.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTable.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTable.class new file mode 100644 index 00000000..bd2ea21d Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTable.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTableColumn.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTableColumn.class new file mode 100644 index 00000000..7dd61c7f Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/domain/GenTableColumn.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableColumnMapper.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableColumnMapper.class new file mode 100644 index 00000000..30237e62 Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableColumnMapper.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableMapper.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableMapper.class new file mode 100644 index 00000000..36d1d096 Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/mapper/GenTableMapper.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableColumnServiceImpl.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableColumnServiceImpl.class new file mode 100644 index 00000000..a7f2447b Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableColumnServiceImpl.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableServiceImpl.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableServiceImpl.class new file mode 100644 index 00000000..52f5c04d Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/GenTableServiceImpl.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableColumnService.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableColumnService.class new file mode 100644 index 00000000..d497f18f Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableColumnService.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableService.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableService.class new file mode 100644 index 00000000..5b11f524 Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/service/IGenTableService.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/util/GenUtils.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/GenUtils.class new file mode 100644 index 00000000..69785b9f Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/GenUtils.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityInitializer.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityInitializer.class new file mode 100644 index 00000000..3e376c8a Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityInitializer.class differ diff --git a/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityUtils.class b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityUtils.class new file mode 100644 index 00000000..b6087b44 Binary files /dev/null and b/backend/roomroot-generator/target/classes/com/roomroot/generator/util/VelocityUtils.class differ diff --git a/backend/roomroot-generator/target/classes/generator.yml b/backend/roomroot-generator/target/classes/generator.yml new file mode 100644 index 00000000..4630ae7a --- /dev/null +++ b/backend/roomroot-generator/target/classes/generator.yml @@ -0,0 +1,12 @@ +# 代码生成 +gen: + # 作者 + author: roomroot + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.roomroot.system + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ + # 是否允许生成文件覆盖到本地(自定义路径),默认不允许 + allowOverwrite: false \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/generator.yml b/backend/roomroot-generator/target/classes/main/resources/generator.yml new file mode 100644 index 00000000..4630ae7a --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/generator.yml @@ -0,0 +1,12 @@ +# 代码生成 +gen: + # 作者 + author: roomroot + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.roomroot.system + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ + # 是否允许生成文件覆盖到本地(自定义路径),默认不允许 + allowOverwrite: false \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableColumnMapper.xml b/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 00000000..d231013a --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + + + insert into GEN_TABLE_COLUMN ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + column_type = #{columnType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableMapper.xml b/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 00000000..9deadefa --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, form_col_num, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + tpl_web_type, + package_name, + module_name, + business_name, + function_name, + function_author, + form_col_num, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{tplWebType}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{formColNum}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + ${sql} + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + form_col_num = #{formColNum}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + tpl_web_type = #{tplWebType}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/controller.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/controller.java.vm new file mode 100644 index 00000000..127966da --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.roomroot.common.annotation.Log; +import com.roomroot.common.core.controller.BaseController; +import com.roomroot.common.core.domain.AjaxResult; +import com.roomroot.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.roomroot.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.roomroot.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/domain.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/domain.java.vm new file mode 100644 index 00000000..50a659e8 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.roomroot.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.roomroot.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.roomroot.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } + +#end +#end +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/mapper.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/mapper.java.vm new file mode 100644 index 00000000..7e7d7c26 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/service.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/service.java.vm new file mode 100644 index 00000000..264882b2 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/serviceImpl.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 00000000..13388750 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.roomroot.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.roomroot.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/java/sub-domain.java.vm b/backend/roomroot-generator/target/classes/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 00000000..d270f1f7 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.roomroot.common.annotation.Excel; +import com.roomroot.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/js/api.js.vm b/backend/roomroot-generator/target/classes/main/resources/vm/js/api.js.vm new file mode 100644 index 00000000..9295524a --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/sql/sql.vm b/backend/roomroot-generator/target/classes/main/resources/vm/sql/sql.vm new file mode 100644 index 00000000..05755835 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/ts/api.ts.vm b/backend/roomroot-generator/target/classes/main/resources/vm/ts/api.ts.vm new file mode 100644 index 00000000..8ed5122b --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/ts/api.ts.vm @@ -0,0 +1,51 @@ +import request from '@/utils/request' +import type { AjaxResult, TableDataInfo, ${BusinessName}QueryParams, ${ClassName} } from '@/types' + +// 查询${functionName}列表 +#if($table.tree) +export function list${BusinessName}(query?: ${BusinessName}QueryParams): Promise> { +#else +export function list${BusinessName}(query: ${BusinessName}QueryParams): Promise> { +#end + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}: number): Promise> { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data: ${ClassName}): Promise { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data: ${ClassName}): Promise { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}: number | number[]): Promise { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/ts/index.ts.vm b/backend/roomroot-generator/target/classes/main/resources/vm/ts/index.ts.vm new file mode 100644 index 00000000..e51ef151 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/ts/index.ts.vm @@ -0,0 +1,9 @@ +/** + * API 类型统一导出 + */ +.... + +// 防止覆盖,需手动追加下面代码到index.ts文件中,追加好后此文件可删除 + +// ${moduleName} 模块 +export * from "./${moduleName}/${businessName}"; \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/ts/type.ts.vm b/backend/roomroot-generator/target/classes/main/resources/vm/ts/type.ts.vm new file mode 100644 index 00000000..fff1d4ca --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/ts/type.ts.vm @@ -0,0 +1,51 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** ${functionName}配置分页查询参数 */ +export interface ${BusinessName}QueryParams extends PageDomain { +#foreach($column in $columns) +#if($column.query) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +#end +} + +/** ${functionName}配置信息 */ +export interface ${ClassName} extends BaseEntity { +#foreach($column in $columns) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + ${subclassName}List?: ${subClassName}[]; +#end +} +#if($table.sub) + +/** ${subTable.functionName}配置信息 */ +export interface ${subClassName} extends BaseEntity { +#foreach ($column in $subTable.columns) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +} +#end diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/index-tree.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 00000000..7a2d0e91 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,565 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/index.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/index.vue.vm new file mode 100644 index 00000000..876dae33 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,660 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index-tree.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 00000000..51e2673e --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,526 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 00000000..66807757 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,639 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/view.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/view.vue.vm new file mode 100644 index 00000000..e486c886 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3/view.vue.vm @@ -0,0 +1,83 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index-tree.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index-tree.vue.vm new file mode 100644 index 00000000..038165ea --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index-tree.vue.vm @@ -0,0 +1,528 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index.vue.vm new file mode 100644 index 00000000..6d0e0d0e --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/index.vue.vm @@ -0,0 +1,644 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/view.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/view.vue.vm new file mode 100644 index 00000000..25bd7f47 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/v3ts/view.vue.vm @@ -0,0 +1,84 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/vue/view.vue.vm b/backend/roomroot-generator/target/classes/main/resources/vm/vue/view.vue.vm new file mode 100644 index 00000000..9911bc85 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/vue/view.vue.vm @@ -0,0 +1,86 @@ + + + diff --git a/backend/roomroot-generator/target/classes/main/resources/vm/xml/mapper.xml.vm b/backend/roomroot-generator/target/classes/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 00000000..456755b5 --- /dev/null +++ b/backend/roomroot-generator/target/classes/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,140 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + +#if($table.sub) + + +#end + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/mapper/generator/GenTableColumnMapper.xml b/backend/roomroot-generator/target/classes/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 00000000..d231013a --- /dev/null +++ b/backend/roomroot-generator/target/classes/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + + + insert into GEN_TABLE_COLUMN ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + column_type = #{columnType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/mapper/generator/GenTableMapper.xml b/backend/roomroot-generator/target/classes/mapper/generator/GenTableMapper.xml new file mode 100644 index 00000000..9deadefa --- /dev/null +++ b/backend/roomroot-generator/target/classes/mapper/generator/GenTableMapper.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, form_col_num, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + tpl_web_type, + package_name, + module_name, + business_name, + function_name, + function_author, + form_col_num, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{tplWebType}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{formColNum}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + ${sql} + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + form_col_num = #{formColNum}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + tpl_web_type = #{tplWebType}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/vm/java/controller.java.vm b/backend/roomroot-generator/target/classes/vm/java/controller.java.vm new file mode 100644 index 00000000..127966da --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.roomroot.common.annotation.Log; +import com.roomroot.common.core.controller.BaseController; +import com.roomroot.common.core.domain.AjaxResult; +import com.roomroot.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.roomroot.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.roomroot.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/backend/roomroot-generator/target/classes/vm/java/domain.java.vm b/backend/roomroot-generator/target/classes/vm/java/domain.java.vm new file mode 100644 index 00000000..50a659e8 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.roomroot.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.roomroot.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.roomroot.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } + +#end +#end +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/backend/roomroot-generator/target/classes/vm/java/mapper.java.vm b/backend/roomroot-generator/target/classes/vm/java/mapper.java.vm new file mode 100644 index 00000000..7e7d7c26 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/backend/roomroot-generator/target/classes/vm/java/service.java.vm b/backend/roomroot-generator/target/classes/vm/java/service.java.vm new file mode 100644 index 00000000..264882b2 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/backend/roomroot-generator/target/classes/vm/java/serviceImpl.java.vm b/backend/roomroot-generator/target/classes/vm/java/serviceImpl.java.vm new file mode 100644 index 00000000..13388750 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.roomroot.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.roomroot.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/backend/roomroot-generator/target/classes/vm/java/sub-domain.java.vm b/backend/roomroot-generator/target/classes/vm/java/sub-domain.java.vm new file mode 100644 index 00000000..d270f1f7 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.roomroot.common.annotation.Excel; +import com.roomroot.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/backend/roomroot-generator/target/classes/vm/js/api.js.vm b/backend/roomroot-generator/target/classes/vm/js/api.js.vm new file mode 100644 index 00000000..9295524a --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/backend/roomroot-generator/target/classes/vm/sql/sql.vm b/backend/roomroot-generator/target/classes/vm/sql/sql.vm new file mode 100644 index 00000000..05755835 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/vm/ts/api.ts.vm b/backend/roomroot-generator/target/classes/vm/ts/api.ts.vm new file mode 100644 index 00000000..8ed5122b --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/ts/api.ts.vm @@ -0,0 +1,51 @@ +import request from '@/utils/request' +import type { AjaxResult, TableDataInfo, ${BusinessName}QueryParams, ${ClassName} } from '@/types' + +// 查询${functionName}列表 +#if($table.tree) +export function list${BusinessName}(query?: ${BusinessName}QueryParams): Promise> { +#else +export function list${BusinessName}(query: ${BusinessName}QueryParams): Promise> { +#end + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}: number): Promise> { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data: ${ClassName}): Promise { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data: ${ClassName}): Promise { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}: number | number[]): Promise { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} + + diff --git a/backend/roomroot-generator/target/classes/vm/ts/index.ts.vm b/backend/roomroot-generator/target/classes/vm/ts/index.ts.vm new file mode 100644 index 00000000..e51ef151 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/ts/index.ts.vm @@ -0,0 +1,9 @@ +/** + * API 类型统一导出 + */ +.... + +// 防止覆盖,需手动追加下面代码到index.ts文件中,追加好后此文件可删除 + +// ${moduleName} 模块 +export * from "./${moduleName}/${businessName}"; \ No newline at end of file diff --git a/backend/roomroot-generator/target/classes/vm/ts/type.ts.vm b/backend/roomroot-generator/target/classes/vm/ts/type.ts.vm new file mode 100644 index 00000000..fff1d4ca --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/ts/type.ts.vm @@ -0,0 +1,51 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** ${functionName}配置分页查询参数 */ +export interface ${BusinessName}QueryParams extends PageDomain { +#foreach($column in $columns) +#if($column.query) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +#end +} + +/** ${functionName}配置信息 */ +export interface ${ClassName} extends BaseEntity { +#foreach($column in $columns) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + ${subclassName}List?: ${subClassName}[]; +#end +} +#if($table.sub) + +/** ${subTable.functionName}配置信息 */ +export interface ${subClassName} extends BaseEntity { +#foreach ($column in $subTable.columns) +#set($type = "string") +#if($column.javaType == "Long" || $column.javaType == "Integer") + #set($type = "number") +#elseif($column.javaType == "Boolean") + #set($type = "boolean") +#end + /** ${column.columnComment} */ + ${column.javaField}?: ${type}; +#end +} +#end diff --git a/backend/roomroot-generator/target/classes/vm/vue/index-tree.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/index-tree.vue.vm new file mode 100644 index 00000000..7a2d0e91 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/index-tree.vue.vm @@ -0,0 +1,565 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/index.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/index.vue.vm new file mode 100644 index 00000000..876dae33 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/index.vue.vm @@ -0,0 +1,660 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3/index-tree.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 00000000..51e2673e --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,526 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3/index.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3/index.vue.vm new file mode 100644 index 00000000..66807757 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3/index.vue.vm @@ -0,0 +1,639 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3/view.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3/view.vue.vm new file mode 100644 index 00000000..e486c886 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3/view.vue.vm @@ -0,0 +1,83 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3ts/index-tree.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3ts/index-tree.vue.vm new file mode 100644 index 00000000..038165ea --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3ts/index-tree.vue.vm @@ -0,0 +1,528 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3ts/index.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3ts/index.vue.vm new file mode 100644 index 00000000..6d0e0d0e --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3ts/index.vue.vm @@ -0,0 +1,644 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/v3ts/view.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/v3ts/view.vue.vm new file mode 100644 index 00000000..25bd7f47 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/v3ts/view.vue.vm @@ -0,0 +1,84 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/vue/view.vue.vm b/backend/roomroot-generator/target/classes/vm/vue/view.vue.vm new file mode 100644 index 00000000..9911bc85 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/vue/view.vue.vm @@ -0,0 +1,86 @@ + + + diff --git a/backend/roomroot-generator/target/classes/vm/xml/mapper.xml.vm b/backend/roomroot-generator/target/classes/vm/xml/mapper.xml.vm new file mode 100644 index 00000000..456755b5 --- /dev/null +++ b/backend/roomroot-generator/target/classes/vm/xml/mapper.xml.vm @@ -0,0 +1,140 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + +#if($table.sub) + + +#end + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/backend/roomroot-generator/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-generator/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-generator/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-generator/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..5adf909c --- /dev/null +++ b/backend/roomroot-generator/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,13 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\config\GenConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\controller\GenController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\domain\GenTable.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\domain\GenTableColumn.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\mapper\GenTableColumnMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\mapper\GenTableMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\service\GenTableColumnServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\service\GenTableServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\service\IGenTableColumnService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\service\IGenTableService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\util\GenUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\util\VelocityInitializer.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-generator\src\main\java\com\roomroot\generator\util\VelocityUtils.java diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.java new file mode 100644 index 00000000..a22db468 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.java @@ -0,0 +1,203 @@ +package com.roomroot.jwgl.interceptor; + +import com.roomroot.jwgl.unit.Result; +import com.roomroot.jwgl.utils.JwglRoleHelper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import tools.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * 按角色限制教务接口访问范围。管理员放行全部。 + */ +@Component +public class JwglApiAccessInterceptor implements HandlerInterceptor { + + private final JwglRoleHelper roleHelper; + private final ObjectMapper objectMapper; + + public JwglApiAccessInterceptor(JwglRoleHelper roleHelper, ObjectMapper objectMapper) { + this.roleHelper = roleHelper; + this.objectMapper = objectMapper; + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + if (HttpMethod.OPTIONS.matches(request.getMethod())) { + return true; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null || !authentication.isAuthenticated() + || "anonymousUser".equals(String.valueOf(authentication.getPrincipal()))) { + return true; + } + if (roleHelper.isAdmin()) { + return true; + } + String path = request.getRequestURI(); + String context = request.getContextPath(); + if (context != null && !context.isEmpty() && path.startsWith(context)) { + path = path.substring(context.length()); + } + if (path.isEmpty()) { + path = "/"; + } + + if (roleHelper.isStudent()) { + if (isStudentAllowed(path, request.getMethod())) { + return true; + } + return deny(response, "学员无权访问该功能"); + } + if (roleHelper.isTeacher()) { + if (isTeacherDenied(path)) { + return deny(response, "教员无权访问该功能"); + } + if (isTeacherAdjustDenied(path, request.getMethod())) { + return deny(response, "教员只能提交、查看和撤销本人的调课申请"); + } + return true; + } + if (roleHelper.isResearchOffice()) { + if (isOfficeDenied(path)) { + return deny(response, "教研室无权访问系统管理功能"); + } + if (isResearchOfficeAdjustDenied(path)) { + return deny(response, "教研室仅可查看和审批本室调课申请"); + } + return true; + } + if (roleHelper.isDepartmentPersonnel()) { + if (isOfficeDenied(path)) { + return deny(response, "机关人员无权访问系统管理功能"); + } + if (isOfficeAdjustDenied(path, request.getMethod())) { + return deny(response, "机关人员仅可查看和审批调课申请"); + } + return true; + } + return true; + } + + private boolean isStudentAllowed(String path, String method) { + if (startsWithAny(path, "/getInfo", "/getRouters", "/logout", "/system/user/profile")) { + return true; + } + if (!HttpMethod.GET.matches(method)) { + return false; + } + return startsWithAny(path, + "/xqxlb", + "/kcb", + "/studentTeamOutputSchedule", + "/classCalendar", + "/course-running/plan/list", + "/course-running/plan/detail", + "/course-running/plan/export", + "/student-records/warning-result", + "/student-records/get", + "/student-records/list", + "/student-records/grades", + "/student-records/process-grades"); + } + + private boolean isTeacherAdjustDenied(String path, String method) { + if (!path.startsWith("/course-running/adjust")) { + return false; + } + if (path.startsWith("/course-running/adjust/audit") + || path.startsWith("/course-running/adjust/receive")) { + return true; + } + if (path.equals("/course-running/adjust/submit")) { + return !HttpMethod.POST.matches(method); + } + return false; + } + + private boolean isResearchOfficeAdjustDenied(String path) { + if (!path.startsWith("/course-running/adjust")) { + return false; + } + if (path.equals("/course-running/adjust/submit") + || path.equals("/course-running/adjust/cancel") + || path.startsWith("/course-running/adjust/lessons") + || path.startsWith("/course-running/adjust/audit/jg") + || path.startsWith("/course-running/adjust/audit/jxx") + || path.startsWith("/course-running/adjust/receive/jg")) { + return true; + } + return false; + } + + private boolean isOfficeAdjustDenied(String path, String method) { + if (!path.startsWith("/course-running/adjust")) { + return false; + } + if (HttpMethod.GET.matches(method)) { + return path.startsWith("/course-running/adjust/lessons") + || path.startsWith("/course-running/adjust/strategy"); + } + return !(path.startsWith("/course-running/adjust/audit/jg") + || path.startsWith("/course-running/adjust/receive/jg")); + } + + private boolean isTeacherDenied(String path) { + return startsWithAny(path, + "/faculty", + "/jys", + "/elective", + "/department", + "/department-personnel", + "/account-management", + "/system-initialization", + "/system/user", + "/system/role", + "/system/menu", + "/system/dept", + "/system/post", + "/monitor", + "/tool") + && !path.startsWith("/system/user/profile"); + } + + private boolean isOfficeDenied(String path) { + return startsWithAny(path, + "/account-management", + "/system-initialization", + "/system/user", + "/system/role", + "/system/menu", + "/system/dept", + "/system/post", + "/monitor", + "/tool") + && !path.startsWith("/system/user/profile"); + } + + private boolean startsWithAny(String path, String... prefixes) { + for (String prefix : prefixes) { + if (path.equals(prefix) || path.startsWith(prefix + "/") || path.startsWith(prefix + "?")) { + return true; + } + } + return false; + } + + private boolean deny(HttpServletResponse response, String message) throws IOException { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.getWriter().write(objectMapper.writeValueAsString(Result.forbidden(message))); + return false; + } +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSDLBMapper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSDLBMapper.java new file mode 100644 index 00000000..786f43e5 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSDLBMapper.java @@ -0,0 +1,19 @@ +package com.roomroot.jwgl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.roomroot.jwgl.entity.JYSDLB; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 教研室登录表 Mapper。 + */ +@Mapper +public interface JYSDLBMapper extends BaseMapper { + + @Select("SELECT TRIM(b.\"教研室代号\") FROM \"教研室登录表\" b " + + "JOIN \"登录信息表\" a ON TRIM(a.\"编号\") = TRIM(b.\"登录信息编号\") " + + "WHERE TRIM(a.\"账号\") = #{username}") + String selectResearchOfficeIdByAccount(@Param("username") String username); +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/utils/JwglRoleHelper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/utils/JwglRoleHelper.java new file mode 100644 index 00000000..9e886ae0 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/utils/JwglRoleHelper.java @@ -0,0 +1,181 @@ +package com.roomroot.jwgl.utils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.roomroot.common.constant.Constants; +import com.roomroot.common.core.domain.entity.SysRole; +import com.roomroot.common.core.domain.entity.SysUser; +import com.roomroot.common.core.domain.model.LoginUser; +import com.roomroot.common.exception.ServiceException; +import com.roomroot.common.utils.SecurityUtils; +import com.roomroot.common.utils.StringUtils; +import com.roomroot.jwgl.entity.JYB; +import com.roomroot.jwgl.entity.XYXX; +import com.roomroot.jwgl.mapper.JYBMapper; +import com.roomroot.jwgl.mapper.JYSDLBMapper; +import com.roomroot.jwgl.mapper.XYXXMapper; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.List; + +import static com.roomroot.jwgl.utils.AccountManagementConstants.ROLE_DEPARTMENT_PERSONNEL; +import static com.roomroot.jwgl.utils.AccountManagementConstants.ROLE_RESEARCH_OFFICE; +import static com.roomroot.jwgl.utils.AccountManagementConstants.ROLE_STUDENT; +import static com.roomroot.jwgl.utils.AccountManagementConstants.ROLE_TEACHER; +import static com.roomroot.jwgl.utils.BasicManagementConstants.FORBIDDEN; + +/** + * 教务角色识别与本人数据范围。 + *

管理员、机关人员(教务部)看全部;教员看本人;学员看本人。

+ */ +@Component +public class JwglRoleHelper { + + @Resource + private JYBMapper jybMapper; + + @Resource + private XYXXMapper xyxxMapper; + + @Resource + private JYSDLBMapper jysdlbMapper; + + public boolean isAdmin() { + try { + if (SecurityUtils.isAdmin()) { + return true; + } + return hasRoleKey(Constants.SUPER_ADMIN); + } catch (Exception ex) { + return false; + } + } + + public boolean isDepartmentPersonnel() { + return isAdmin() || hasRoleKey(ROLE_DEPARTMENT_PERSONNEL); + } + + public boolean isResearchOffice() { + if (isDepartmentPersonnel()) { + return false; + } + if (hasRoleKey(ROLE_RESEARCH_OFFICE)) { + return true; + } + if (hasRoleKey(ROLE_TEACHER)) { + return false; + } + return StringUtils.isNotEmpty(findResearchOfficeId()); + } + + public boolean isTeacher() { + return !isDepartmentPersonnel() && !isResearchOffice() && hasRoleKey(ROLE_TEACHER); + } + + public boolean isStudent() { + return !isDepartmentPersonnel() && !hasRoleKey(ROLE_TEACHER) && hasRoleKey(ROLE_STUDENT); + } + + public String requireTeacherId() { + String teacherId = findTeacherId(); + if (StringUtils.isEmpty(teacherId)) { + throw new ServiceException("当前登录用户不是教员,无法查看教员数据", FORBIDDEN); + } + return teacherId; + } + + public String requireResearchOfficeId() { + String officeId = findResearchOfficeId(); + if (StringUtils.isEmpty(officeId)) { + throw new ServiceException("当前登录用户不是教研室账号,无法审批本室申请", FORBIDDEN); + } + return officeId; + } + + public String findResearchOfficeId() { + try { + String username = SecurityUtils.getUsername(); + if (StringUtils.isEmpty(username) || jysdlbMapper == null) { + return null; + } + return jysdlbMapper.selectResearchOfficeIdByAccount(username); + } catch (Exception ignored) { + return null; + } + } + + public String requireStudentId() { + String studentId = findStudentId(); + if (StringUtils.isEmpty(studentId)) { + throw new ServiceException("当前登录用户不是学员,无法查看学员数据", FORBIDDEN); + } + return studentId; + } + + public String findTeacherId() { + try { + String username = SecurityUtils.getUsername(); + if (StringUtils.isNotEmpty(username)) { + String fromLogin = jybMapper.selectTeacherIdByAccount(username); + if (StringUtils.isNotEmpty(fromLogin)) { + return fromLogin.trim(); + } + JYB byId = jybMapper.selectById(username); + if (byId != null) { + return byId.getJybh(); + } + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + String nickName = user == null ? null : user.getNickName(); + if (StringUtils.isNotEmpty(nickName)) { + List matched = jybMapper.selectList( + new LambdaQueryWrapper().eq(JYB::getJyxm, nickName)); + if (matched != null && matched.size() == 1) { + return matched.get(0).getJybh(); + } + } + } catch (Exception ignored) { + return null; + } + return null; + } + + public String findStudentId() { + try { + String username = SecurityUtils.getUsername(); + if (StringUtils.isNotEmpty(username)) { + XYXX byXh = xyxxMapper.selectOne( + new LambdaQueryWrapper().eq(XYXX::getXh, username)); + if (byXh != null) { + return byXh.getBh(); + } + XYXX byBh = xyxxMapper.selectById(username); + if (byBh != null) { + return byBh.getBh(); + } + } + } catch (Exception ignored) { + return null; + } + return null; + } + + private boolean hasRoleKey(String roleKey) { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + if (user == null || user.getRoles() == null || StringUtils.isEmpty(roleKey)) { + return false; + } + for (SysRole role : user.getRoles()) { + if (role != null && roleKey.equalsIgnoreCase(role.getRoleKey())) { + return true; + } + } + return false; + } catch (Exception ex) { + return false; + } + } +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.java new file mode 100644 index 00000000..3ab6b942 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.java @@ -0,0 +1,52 @@ +package com.roomroot.jwgl.vo.courserunning; + +import lombok.Data; + +/** + * 可供调课的课次,来自学员队任务表,并关联课表、课程表。 + */ +@Data +public class AdjustableLessonVO { + + /** 实施_课程表编号(实施_调课申请主关联) */ + private String sskcbbh; + + /** 原上课日期 */ + private java.time.LocalDateTime rq; + + /** 原节次 */ + private Integer jc; + + /** 学员队任务表编号 */ + private String xydrwbh; + + /** 课表.课编号 */ + private String kbh; + + /** 课程名称 */ + private String kcmc; + + /** 学员队编号 */ + private String xydbh; + + /** 学员队名称 */ + private String xydmc; + + /** 教员编号 */ + private String jybh; + + /** 课次序号 */ + private Integer kcxh; + + /** 教室编号 */ + private String jsbh; + + /** 年度 */ + private Integer nd; + + /** 教研室代号 */ + private String jysdh; + + /** 课程表编号 */ + private String kcbbh; +} diff --git a/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.class b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.class new file mode 100644 index 00000000..8dde6759 Binary files /dev/null and b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/interceptor/JwglApiAccessInterceptor.class differ diff --git a/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/mapper/JYSDLBMapper.class b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/mapper/JYSDLBMapper.class new file mode 100644 index 00000000..dd6c308d Binary files /dev/null and b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/mapper/JYSDLBMapper.class differ diff --git a/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/utils/JwglRoleHelper.class b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/utils/JwglRoleHelper.class new file mode 100644 index 00000000..a8ede232 Binary files /dev/null and b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/utils/JwglRoleHelper.class differ diff --git a/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.class b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.class new file mode 100644 index 00000000..42477a5c Binary files /dev/null and b/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/vo/courserunning/AdjustableLessonVO.class differ diff --git a/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..423c4950 --- /dev/null +++ b/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,2 @@ +com\roomroot\jwgl\vo\courserunning\AdjustableLessonVO.class +com\roomroot\jwgl\mapper\JYSDLBMapper.class diff --git a/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..9930a7eb --- /dev/null +++ b/backend/roomroot-jwgl/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,623 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\config\AccountManagementWebMvcConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountCreateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountDisableDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountLoginDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountLoginInformationQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountMergeDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountPasswordChangeDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountPasswordResetDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountRoleAssignmentDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountRoleConfigurationDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountRoleOptionQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountSsoSessionResolveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\accountmanagement\AccountUpdateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\PersonnelAffiliationDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\PersonnelTransferDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\ResearchOfficeAffiliationAddDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\ResearchOfficeAffiliationIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\ResearchOfficeAffiliationQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\ResearchOfficeOptionQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\affiliationsetting\TeachingClassAffiliationDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\AdjustRoomDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\AdjustSupportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\AdjustTeacherDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\AdjustTeamDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ClassesImportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ImportRemoveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\OperationAnalysisQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ScheduleAdjustApplyDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ScheduleAdjustAuditDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ScheduleAdjustQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\ScheduleAdjustStrategyDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\SemesterImportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\SingleCourseImportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\StudentLeaveApplyDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\StudentLeaveAuditDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\StudentLeaveQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingPlanBatchFillDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingPlanFillDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingPlanQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingSupportBatchPlanDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingSupportConfirmDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingSupportPlanDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingSupportPlanItemDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\courserunning\TeachingSupportUpdateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\department\DepartmentCreateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\department\DepartmentIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\department\DepartmentQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\department\DepartmentUpdateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\departmentpersonnel\DepartmentPersonnelCreateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\departmentpersonnel\DepartmentPersonnelIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\departmentpersonnel\DepartmentPersonnelImportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\departmentpersonnel\DepartmentPersonnelQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\departmentpersonnel\DepartmentPersonnelUpdateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\dict\DictDataBatchQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\dict\DictDataQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\dict\DictDataSaveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\dict\DictTypeQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\dict\DictTypeSaveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\elective\AddClassDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\faculty\AddTeacherDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\ks\HourStatisticsQuery.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\LeaveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\LeaveQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementCreateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementPriorityDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementPublishDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementRecipientInsertDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementRecipientQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\NoticeAnnouncementUpdateDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\noticeannouncement\UserNoticeAnnouncementQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\notificationlog\NotificationLogExportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\notificationlog\NotificationLogIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\notificationlog\NotificationLogQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\notificationlog\NotificationLogRecipientQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\operationlog\OperationLogExportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\operationlog\OperationLogIdDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\operationlog\OperationLogQueryDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\operationlog\OperationLogRecordDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SemesterInitializationSaveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationConfigurationSaveDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationDepartmentImportRowDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationExecutionDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationHistoricalDataDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationHistoricalImportDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationPersonnelImportRowDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\dto\systeminitialization\SystemInitializationResearchOfficeImportRowDTO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\accountmanagement\AccountRecord.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\accountmanagement\AccountRoleRecord.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BCKTJXRZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BCKTJXRZSKJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BCXQJCXQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BK.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BKDDB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BKJKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BKXY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BZLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BZMX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\BZTGMX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CJGGRZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPCPRYB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPCPYWJGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPJGPJJLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPNDCPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPPCDJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CPTXPJJLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\CZRZB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DBVersion.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DDDLTBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DKSQBZMX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DKSQFZJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DKSQJS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DKSQXYD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DLJLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DLXXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\DXJSGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FWBDRWB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FWBDWPRYB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FWBDWPRYSCFJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FWBDXQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FWBDXQFJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSSSXXM.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSXXMBC.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSXXMDS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSXXMFXKT.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSXXMSXJGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FXKTSXXMXY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FZQZBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FZQZBZQZGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FZZHGZBZCPJGYS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\FZZHGZBZZHGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKJL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKJLPJJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKLDJL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKLDJLPJJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKZJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GCKZJPJJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GKLDCKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GKLDLBZBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GKZJCKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GZTKJGRY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\GZTKJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JCKCD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JCKCMXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JCSJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JCXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JG.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JGRYDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSBKCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSFSKSXS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSSCKCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSZW.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JSZWKSFBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXCDL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXCDLBRW.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXGLJG.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXRW.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXRWJCXQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXRZJYKSBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXRZKSBZSPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXRZXYXXQK.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXSSJH.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JXSSJHTJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYKSBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYNZKSF.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYSB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYSCKCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYSDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYSRWS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYSX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JYZJZGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\JZGZL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBBZMX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBMBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBZFJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBZSP.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCBZXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCCJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCGCCJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCJC.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KCJXYX_CZRZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KLXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSBZXM.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSFBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSHBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSTJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KSXSFA.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KTBZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KTJXFF.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KTJXFFKSXS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KTRZXYKQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYKJJXSBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYKYCGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYKYJFB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYKYXMB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYSBGLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYSYSJSB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYXSJLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\KYZDKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\LBSBXXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\LBZYGLPT.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\LDGCKCPMB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\LLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\MemberOnlineInfo.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\MHKSQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\N2JYJXZLCPCJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\N2XQJYJXZLCPXM.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\N2YXTBQK.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\NDZHPD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\NDZHPDJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\NDZHPDJYS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\NZKSF.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\PJBJPKYS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\PJKCAPYS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\PXRW.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\QJKTB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\QJXYB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\RYDASHBMSZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ScheduleAdjustStrategy.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSDKSQ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSDKSQSP.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSJG.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSJGCM.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSJGJYS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSJGXYD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKC.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCB_RZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCBFZJY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCBJS.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCBXYD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSKCXYD.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSOAppInfo.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSOUserAuthOperate.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SSOUserAuthSession.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SysDictData.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\SysDictType.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TCKGLY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TCKGLYDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TGYHXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TimetableConflictResult.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\TKJL.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\WJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\WSRYZCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\WSSXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\WSWDB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XKZYXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XQ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XQJYKCSKQKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XQJYXXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XQWTKYYDJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XQXLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYCPCPXMB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDMYDCPCPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDNDXQJBXXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDPBXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDRWB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYDSCKCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYFBLJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYJXQJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYKCBKCP.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYKCBKCPQZX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYKCCJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYKCGCCJ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYMYDCPCPBC.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYMYDCPCPXY.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYMYDCPXM.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYMYDCPXMCPX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYPBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYQJSPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYSKJYCPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYSKJYCPBQZX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYSKJYJCCPB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYSKJYJCCPBQZX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXJYDSQB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXJYJJGB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXJYJTJB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXX.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXXB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXXBB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\XYXXGGRZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\YCB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\YHB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\YHDLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\YJFKB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZHPDGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZHPDGZJYSJLRDGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZHPDGZZHJSGZ.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZHZTB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZJDDCPMB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZYB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZYBZLB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\entity\ZYJXJHB.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\interceptor\AccountManagementAuthorizationInterceptor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\interceptor\JwglApiAccessInterceptor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\interceptor\OperationLogInterceptor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\AccountManagementAuthorizationMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\AccountManagementMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\BCKTJXRZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\BCKTJXRZSKJYMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\BuildMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\BZLBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\BZTGMXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ClassRoomCalendarMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ClassRoomLessonMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ClassRoomMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ClassSemesterCalendarMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ClassSemesterMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DBVersionMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DDDLTBBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DictDataMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DictTypeMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DKSQBZMXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DKSQFZJYMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DKSQJSMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DKSQXYDMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DLJLBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DLXXBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\DXJSGZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\GKLDLBZBBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JGMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JSZWKSFBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JXRZJYKSBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JXRZKSBZSPBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JXRZXYXXQKMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JXSSJHTJBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYKSBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYNZKSFMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYSBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYSCKCBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYSDLBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JYSXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\JZGZLMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KCBBZMXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KCBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KCBMBBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KCBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KCJXYX_CZRZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KLXBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KSBZXMMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KSFBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KSHBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KSTJBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KSXSFAMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KTBZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KTRZXYKQBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\KYKYJFBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\LBZYGLPTMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\MemberOnlineInfoMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\NDZHPDJYMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\NoticeAnnouncementMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\NotificationLogMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\NZKSFMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\OfficeTaskBookMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\OperationAnalysisMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\OperationLogMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\QJKTBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\QJXYBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ScheduleAdjustStrategyMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SemesterCalendarMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SemesterMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSDKSQMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSDKSQSPMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSJGCMMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSJGJYSMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSJGMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSJGXYDMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCB_RZMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCBFZJYMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCBJSMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCBXYDMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSKCXYDMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSOAppInfoMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSOUserAuthOperateMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SSOUserAuthSessionMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\StudentTeamOutputScheduleMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\StudentTeamTaskMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\SystemInitializationMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TCKGLYDLBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TCKGLYMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeacherHoursMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeachingMaterialMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeachingPlanMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeachingStockDetailMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeachingStockMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TeachingTaskMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TGBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TGYHXXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\TimetableConflictResultMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\WJMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\WSRYZCBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\WSSXBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\WSWDBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XKZYXXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XQMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYCPCPXMBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYDBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYDQBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYJXQJBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYKCCJMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYKCGCCJMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYMYDCPXMMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYQJSPBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYXJYDSQBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYXJYJJGBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYXJYJTJBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\XYXXMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\YCBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\YJFKBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ZYBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\mapper\ZYJXJHBMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\AccountManagementService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\AffiliationSettingService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\BuildService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\BZLBService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ClassRoomCalendarService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ClassRoomLessonService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ClassRoomService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ClassSemesterCalendarService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ClassSemesterService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\CourseRunningImportService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\CourseTeachingService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\DepartmentManagementService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\DepartmentPersonnelService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\DictDataService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\DictTypeService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\DisciplineService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ElectiveService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\FacultyService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\AccountManagementServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\AffiliationSettingServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\BuildServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\BZLBServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ClassRoomCalendarServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ClassRoomJSBKCBServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ClassRoomServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ClassSemesterCalendarServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ClassSemesterServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\CourseRunningImportServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\CourseTeachingServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\DepartmentManagementServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\DepartmentPersonnelServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\DictDataServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\DictTypeServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\DisciplineServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ElectiveServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\FacultyServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\KBServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\KCBServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\KJServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\KSServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\LeaveServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\LogServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\NoticeAnnouncementServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\NotificationLogServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\OfficeTaskBookServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\OperationLogServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\SemesterCalendarServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\SemesterServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\StudentRecordsServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\StudentTeamOutputScheduleServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\StudentTeamTaskServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\SystemInitializationServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TeachingMaterialServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TeachingPlanServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TeachingStockDetailServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TeachingStockServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TeachingTaskServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TimetableConflictServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\TrainingProgramServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\impl\ZYJXJHBServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\KBService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\KCBService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\KJService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\KSService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\LeaveService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\LogService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\NoticeAnnouncementService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\NotificationLogService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\OfficeTaskBookService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\OperationLogService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\SemesterCalendarService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\SemesterService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\StudentRecordsService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\StudentTeamOutputScheduleService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\StudentTeamTaskService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\SystemInitializationService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TeachingMaterialService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TeachingPlanService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TeachingStockDetailService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TeachingStockService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TeachingTaskService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TimetableConflictService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\TrainingProgramService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\service\ZYJXJHBService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\AccountLoginFailedException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\BaseEntity.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\BaseQuery.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\BusinessException.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\conflict\TimetableConflictDimension.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\Constants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\PageQuery.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\PageResult.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\Result.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\unit\StatusEnum.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\AccountLoginCaptchaUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\AccountManagementConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\AccountManagementUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\BasicManagementConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\DateCourseUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\DateUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\ExcelExportUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\ExcelParseUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\JwglRoleHelper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\NoticeAnnouncementConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\NoticeAnnouncementUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\NotificationLogConstants.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\NotificationLogUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\OperationLogUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\PageResultUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\SupportConfirmUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\SystemInitializationUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\utils\UuidUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\validator\StudentLeaveValidator.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountLoginCaptchaVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountLoginHistoryVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountLoginInformationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountLoginVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountMergeResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountRoleOptionVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountRoleTypeVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountRoleVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountSsoSessionVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\accountmanagement\AccountVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\AffiliationDepartmentVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\PersonnelAffiliationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\ResearchOfficeAffiliationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\ResearchOfficeVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\TeachingClassAffiliationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\affiliationsetting\TransferHistoryVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\AdjustableLessonVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\AdjustRoomVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\AdjustSupportVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\AdjustTeacherVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\AdjustTeamVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\CourseCompletionByDeptVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\CourseRunningImportResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\GroupTeachingTaskVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\OperationOverviewVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\ScheduleAdjustApplyVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\ScheduleAdjustAuditVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\ScheduleAdjustDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\ScheduleAdjustStrategyVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\ScheduleAdjustTrendVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\StudentLeaveApplyVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\StudentLeaveDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingPlanDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingPlanFillResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingPlanLessonVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingSupportConfirmResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingSupportHistoryVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingSupportPlanVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\TeachingSupportResourceVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\courserunning\VenueUsageRateVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\department\DepartmentTreeVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\department\DepartmentVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\departmentpersonnel\DepartmentPersonnelDepartmentVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\departmentpersonnel\DepartmentPersonnelVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\dict\DictDataVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\dict\DictTypeVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\elective\ClassScheduleVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\elective\ElectiveClassVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\elective\SemesterInitVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\elective\StudentAbsenceVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\elective\StudentGradeVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\faculty\TeacherListVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\ks\HourStatisticsVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\log\TeacherHoursVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\log\TeachingLogListVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\NoticeAnnouncementDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\NoticeAnnouncementPublishResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\NoticeAnnouncementRecipientVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\NoticeAnnouncementStatisticsVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\NoticeAnnouncementVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\UserNoticeAnnouncementDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\noticeannouncement\UserNoticeAnnouncementVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\notificationlog\NotificationLogDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\notificationlog\NotificationLogRecipientVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\notificationlog\NotificationLogStatisticsVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\notificationlog\NotificationLogVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\operationlog\OperationLogDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\operationlog\OperationLogModuleVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\operationlog\OperationLogVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SemesterInitializationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SystemInitializationCheckItemVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SystemInitializationConfigurationVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SystemInitializationExecutionResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SystemInitializationHistoricalImportResultVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\systeminitialization\SystemInitializationPrecheckVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\timetableconflict\TimetableConflictCardVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\timetableconflict\TimetableConflictDetailVO.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-jwgl\src\main\java\com\roomroot\jwgl\vo\timetableconflict\TimetableConflictSummaryVO.java diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobController.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobController.class new file mode 100644 index 00000000..38afe72c Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobController.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobLogController.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobLogController.class new file mode 100644 index 00000000..ec5abda4 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/controller/SysJobLogController.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJob.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJob.class new file mode 100644 index 00000000..ee080c81 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJob.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJobLog.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJobLog.class new file mode 100644 index 00000000..2d5e8f66 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/domain/SysJobLog.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobLogMapper.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobLogMapper.class new file mode 100644 index 00000000..82b76ca7 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobLogMapper.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobMapper.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobMapper.class new file mode 100644 index 00000000..869ef8a6 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/mapper/SysJobMapper.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobLogService.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobLogService.class new file mode 100644 index 00000000..d38206e3 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobLogService.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobService.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobService.class new file mode 100644 index 00000000..ccd6b243 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/ISysJobService.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobLogServiceImpl.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobLogServiceImpl.class new file mode 100644 index 00000000..a3cd8a56 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobLogServiceImpl.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobServiceImpl.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobServiceImpl.class new file mode 100644 index 00000000..51e2d86e Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/service/impl/SysJobServiceImpl.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/task/RyTask.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/task/RyTask.class new file mode 100644 index 00000000..f6b8c62b Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/task/RyTask.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/AbstractQuartzJob.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/AbstractQuartzJob.class new file mode 100644 index 00000000..646add5c Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/AbstractQuartzJob.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/CronUtils.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/CronUtils.class new file mode 100644 index 00000000..7165dd39 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/CronUtils.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/JobInvokeUtil.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/JobInvokeUtil.class new file mode 100644 index 00000000..36ae8eb0 Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/JobInvokeUtil.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzDisallowConcurrentExecution.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzDisallowConcurrentExecution.class new file mode 100644 index 00000000..f6994eda Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzDisallowConcurrentExecution.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzJobExecution.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzJobExecution.class new file mode 100644 index 00000000..3c5d242d Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/QuartzJobExecution.class differ diff --git a/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/ScheduleUtils.class b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/ScheduleUtils.class new file mode 100644 index 00000000..2aa5a93b Binary files /dev/null and b/backend/roomroot-quartz/target/classes/com/roomroot/quartz/util/ScheduleUtils.class differ diff --git a/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobLogMapper.xml b/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 00000000..b06fd2ac --- /dev/null +++ b/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, start_time, end_time, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + start_time, + end_time, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + #{startTime}, + #{endTime}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobMapper.xml b/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobMapper.xml new file mode 100644 index 00000000..9b4423bb --- /dev/null +++ b/backend/roomroot-quartz/target/classes/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-quartz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-quartz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-quartz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-quartz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..b730764b --- /dev/null +++ b/backend/roomroot-quartz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,18 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\config\ScheduleConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\controller\SysJobController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\controller\SysJobLogController.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\domain\SysJob.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\domain\SysJobLog.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\mapper\SysJobLogMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\mapper\SysJobMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\service\impl\SysJobLogServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\service\impl\SysJobServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\service\ISysJobLogService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\service\ISysJobService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\task\RyTask.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\AbstractQuartzJob.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\CronUtils.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\JobInvokeUtil.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\QuartzDisallowConcurrentExecution.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\QuartzJobExecution.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-quartz\src\main\java\com\roomroot\quartz\util\ScheduleUtils.java diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysCache.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysCache.class new file mode 100644 index 00000000..388c43e6 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysCache.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysConfig.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysConfig.class new file mode 100644 index 00000000..5ee1e9ce Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysConfig.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysLogininfor.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysLogininfor.class new file mode 100644 index 00000000..78953654 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysLogininfor.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNotice.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNotice.class new file mode 100644 index 00000000..82537c47 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNotice.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNoticeRead.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNoticeRead.class new file mode 100644 index 00000000..fcafea39 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysNoticeRead.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysOperLog.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysOperLog.class new file mode 100644 index 00000000..4c04e8fa Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysOperLog.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysPost.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysPost.class new file mode 100644 index 00000000..22fe8654 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysPost.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleDept.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleDept.class new file mode 100644 index 00000000..46179b3a Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleDept.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleMenu.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleMenu.class new file mode 100644 index 00000000..b8c48cfe Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysRoleMenu.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserOnline.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserOnline.class new file mode 100644 index 00000000..56a92296 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserOnline.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserPost.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserPost.class new file mode 100644 index 00000000..061ee4e7 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserPost.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserRole.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserRole.class new file mode 100644 index 00000000..f1ec1bed Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/SysUserRole.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/MetaVo.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/MetaVo.class new file mode 100644 index 00000000..c9322098 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/MetaVo.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/RouterVo.class b/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/RouterVo.class new file mode 100644 index 00000000..f242245c Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/domain/vo/RouterVo.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysConfigMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysConfigMapper.class new file mode 100644 index 00000000..82c824fd Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysConfigMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDeptMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDeptMapper.class new file mode 100644 index 00000000..d21ede52 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDeptMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictDataMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictDataMapper.class new file mode 100644 index 00000000..e5229b5c Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictDataMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictTypeMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictTypeMapper.class new file mode 100644 index 00000000..20d2c907 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysDictTypeMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysLogininforMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysLogininforMapper.class new file mode 100644 index 00000000..c5638839 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysLogininforMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysMenuMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysMenuMapper.class new file mode 100644 index 00000000..81c00e02 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysMenuMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeMapper.class new file mode 100644 index 00000000..3ca554e7 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeReadMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeReadMapper.class new file mode 100644 index 00000000..3626235b Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysNoticeReadMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysOperLogMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysOperLogMapper.class new file mode 100644 index 00000000..b972bc45 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysOperLogMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysPostMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysPostMapper.class new file mode 100644 index 00000000..962b63f1 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysPostMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleDeptMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleDeptMapper.class new file mode 100644 index 00000000..5b5096fc Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleDeptMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMapper.class new file mode 100644 index 00000000..6af01f1c Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMenuMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMenuMapper.class new file mode 100644 index 00000000..4a6e7f1e Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysRoleMenuMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserMapper.class new file mode 100644 index 00000000..f976d5f0 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserPostMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserPostMapper.class new file mode 100644 index 00000000..5c85ad10 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserPostMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserRoleMapper.class b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserRoleMapper.class new file mode 100644 index 00000000..41aeb54b Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/mapper/SysUserRoleMapper.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysConfigService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysConfigService.class new file mode 100644 index 00000000..aa410c76 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysConfigService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDeptService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDeptService.class new file mode 100644 index 00000000..56a98b94 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDeptService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictDataService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictDataService.class new file mode 100644 index 00000000..d775bbe8 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictDataService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictTypeService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictTypeService.class new file mode 100644 index 00000000..3d9f5015 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysDictTypeService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysLogininforService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysLogininforService.class new file mode 100644 index 00000000..72167716 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysLogininforService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysMenuService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysMenuService.class new file mode 100644 index 00000000..11be11e3 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysMenuService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeReadService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeReadService.class new file mode 100644 index 00000000..f9e146be Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeReadService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeService.class new file mode 100644 index 00000000..1afd88f9 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysNoticeService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysOperLogService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysOperLogService.class new file mode 100644 index 00000000..ffc4a5f4 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysOperLogService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysPostService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysPostService.class new file mode 100644 index 00000000..3b7122a9 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysPostService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysRoleService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysRoleService.class new file mode 100644 index 00000000..1fdcf815 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysRoleService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserOnlineService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserOnlineService.class new file mode 100644 index 00000000..59853e21 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserOnlineService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserService.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserService.class new file mode 100644 index 00000000..cb55df98 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/ISysUserService.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysConfigServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysConfigServiceImpl.class new file mode 100644 index 00000000..e0332150 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysConfigServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDeptServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDeptServiceImpl.class new file mode 100644 index 00000000..4ed39078 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDeptServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictDataServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictDataServiceImpl.class new file mode 100644 index 00000000..878067dc Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictDataServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictTypeServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictTypeServiceImpl.class new file mode 100644 index 00000000..9a859e23 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysDictTypeServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysLogininforServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysLogininforServiceImpl.class new file mode 100644 index 00000000..460f2eb2 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysLogininforServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysMenuServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysMenuServiceImpl.class new file mode 100644 index 00000000..e35f893b Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysMenuServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeReadServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeReadServiceImpl.class new file mode 100644 index 00000000..f99d0ffa Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeReadServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeServiceImpl.class new file mode 100644 index 00000000..1170de79 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysNoticeServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysOperLogServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysOperLogServiceImpl.class new file mode 100644 index 00000000..ea53db1c Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysOperLogServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysPostServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysPostServiceImpl.class new file mode 100644 index 00000000..f60a6af3 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysPostServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysRoleServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysRoleServiceImpl.class new file mode 100644 index 00000000..d63eca70 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysRoleServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserOnlineServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserOnlineServiceImpl.class new file mode 100644 index 00000000..8a93f873 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserOnlineServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserServiceImpl.class b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserServiceImpl.class new file mode 100644 index 00000000..5a91f1e1 Binary files /dev/null and b/backend/roomroot-system/target/classes/com/roomroot/system/service/impl/SysUserServiceImpl.class differ diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysConfigMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 00000000..427cb8cc --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDeptMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 00000000..d1d2178b --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept set order_num = #{orderNum} where dept_id = #{deptId} + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictDataMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 00000000..509cf3a1 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictTypeMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 00000000..c7b22320 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysLogininforMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 00000000..ab2182f3 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysMenuMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 00000000..f80e4100 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + query = #{query}, + route_name = #{routeName}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + query, + route_name, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{routeName}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_menu set order_num = #{orderNum} where menu_id = #{menuId} + + + + delete from sys_menu where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 00000000..ef97bc12 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, TO_CHAR(notice_content) AS notice_content, status, create_by, create_time, update_by, update_time, remark + from sys_notice + + + + + + + + insert into sys_notice ( + notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time + )values( + #{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id in + + #{noticeId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeReadMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeReadMapper.xml new file mode 100644 index 00000000..40b2840a --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysNoticeReadMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + INSERT INTO sys_notice_read (notice_id, user_id, read_time) + SELECT #{noticeId}, #{userId}, SYSDATE + FROM DUAL + WHERE NOT EXISTS ( + SELECT 1 FROM sys_notice_read + WHERE notice_id = #{noticeId} AND user_id = #{userId} + ); + + + + + + + + + + + + + + insert ignore into sys_notice_read (notice_id, user_id, read_time) + values + + (#{noticeId}, #{userId}, sysdate()) + + + + + + delete from sys_notice_read where notice_id in + + #{noticeId} + + + + + + + diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysOperLogMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 00000000..2e863407 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysPostMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 00000000..c386f3ba --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleDeptMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 00000000..084aa70d --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 00000000..d1a28dd7 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMenuMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 00000000..1026d52d --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 00000000..e080761f --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.remark, + d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + pwd_update_date, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{pwdUpdateDate}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set avatar = #{avatar}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set login_ip = #{loginIp}, login_date = #{loginDate} where user_id = #{userId} + + + + update sys_user set pwd_update_date = sysdate(), password = #{password}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserPostMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 00000000..b4328864 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserRoleMapper.xml b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 00000000..aff26554 --- /dev/null +++ b/backend/roomroot-system/target/classes/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysConfigMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysConfigMapper.xml new file mode 100644 index 00000000..427cb8cc --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysConfigMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysDeptMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysDeptMapper.xml new file mode 100644 index 00000000..d1d2178b --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysDeptMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept set order_num = #{orderNum} where dept_id = #{deptId} + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysDictDataMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysDictDataMapper.xml new file mode 100644 index 00000000..509cf3a1 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysDictTypeMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 00000000..c7b22320 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysLogininforMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysLogininforMapper.xml new file mode 100644 index 00000000..ab2182f3 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysMenuMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysMenuMapper.xml new file mode 100644 index 00000000..f80e4100 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysMenuMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + query = #{query}, + route_name = #{routeName}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + query, + route_name, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{routeName}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_menu set order_num = #{orderNum} where menu_id = #{menuId} + + + + delete from sys_menu where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysNoticeMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysNoticeMapper.xml new file mode 100644 index 00000000..ef97bc12 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, TO_CHAR(notice_content) AS notice_content, status, create_by, create_time, update_by, update_time, remark + from sys_notice + + + + + + + + insert into sys_notice ( + notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time + )values( + #{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id in + + #{noticeId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysNoticeReadMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysNoticeReadMapper.xml new file mode 100644 index 00000000..40b2840a --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysNoticeReadMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + INSERT INTO sys_notice_read (notice_id, user_id, read_time) + SELECT #{noticeId}, #{userId}, SYSDATE + FROM DUAL + WHERE NOT EXISTS ( + SELECT 1 FROM sys_notice_read + WHERE notice_id = #{noticeId} AND user_id = #{userId} + ); + + + + + + + + + + + + + + insert ignore into sys_notice_read (notice_id, user_id, read_time) + values + + (#{noticeId}, #{userId}, sysdate()) + + + + + + delete from sys_notice_read where notice_id in + + #{noticeId} + + + + + + + diff --git a/backend/roomroot-system/target/classes/mapper/system/SysOperLogMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysOperLogMapper.xml new file mode 100644 index 00000000..2e863407 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysPostMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysPostMapper.xml new file mode 100644 index 00000000..c386f3ba --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysRoleDeptMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 00000000..084aa70d --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysRoleMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysRoleMapper.xml new file mode 100644 index 00000000..d1a28dd7 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysRoleMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysRoleMenuMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 00000000..1026d52d --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysUserMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysUserMapper.xml new file mode 100644 index 00000000..e080761f --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysUserMapper.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.remark, + d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + pwd_update_date, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{pwdUpdateDate}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set avatar = #{avatar}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set login_ip = #{loginIp}, login_date = #{loginDate} where user_id = #{userId} + + + + update sys_user set pwd_update_date = sysdate(), password = #{password}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysUserPostMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysUserPostMapper.xml new file mode 100644 index 00000000..b4328864 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/classes/mapper/system/SysUserRoleMapper.xml b/backend/roomroot-system/target/classes/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 00000000..aff26554 --- /dev/null +++ b/backend/roomroot-system/target/classes/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + \ No newline at end of file diff --git a/backend/roomroot-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/roomroot-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/backend/roomroot-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/roomroot-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..6971378c --- /dev/null +++ b/backend/roomroot-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,56 @@ +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysCache.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysConfig.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysLogininfor.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysNotice.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysNoticeRead.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysOperLog.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysPost.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysRoleDept.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysRoleMenu.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysUserOnline.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysUserPost.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\SysUserRole.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\vo\MetaVo.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\domain\vo\RouterVo.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysConfigMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysDeptMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysDictDataMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysDictTypeMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysLogininforMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysMenuMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysNoticeMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysNoticeReadMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysOperLogMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysPostMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysRoleDeptMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysRoleMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysRoleMenuMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysUserMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysUserPostMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\mapper\SysUserRoleMapper.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysConfigServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysDeptServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysDictDataServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysDictTypeServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysLogininforServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysMenuServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysNoticeReadServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysNoticeServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysOperLogServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysPostServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysRoleServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysUserOnlineServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\impl\SysUserServiceImpl.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysConfigService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysDeptService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysDictDataService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysDictTypeService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysLogininforService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysMenuService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysNoticeReadService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysNoticeService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysOperLogService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysPostService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysRoleService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysUserOnlineService.java +D:\IDE-WorkSpace\New-JW\backend\roomroot-system\src\main\java\com\roomroot\system\service\ISysUserService.java diff --git a/backend/sql/adjust_schedule_20260821.sql b/backend/sql/adjust_schedule_20260821.sql new file mode 100644 index 00000000..21700ace --- /dev/null +++ b/backend/sql/adjust_schedule_20260821.sql @@ -0,0 +1,24 @@ +-- 调课申请增加与学员队任务表、课表、课程表的关联字段 +ALTER TABLE "实施_调课申请" ADD "学员队任务编号" VARCHAR(50); +ALTER TABLE "实施_调课申请" ADD "课编号" VARCHAR(50); +ALTER TABLE "实施_调课申请" ADD "课程表编号" VARCHAR(50); +ALTER TABLE "实施_调课申请" ADD "教研室代号" VARCHAR(50); +ALTER TABLE "实施_调课申请" ADD "原教室编号" VARCHAR(50); +ALTER TABLE "实施_调课申请" ADD "新教室编号" VARCHAR(50); + +-- 教研室角色(达梦需开启 IDENTITY_INSERT) +SET IDENTITY_INSERT SYS_ROLE ON; +INSERT INTO SYS_ROLE (ROLE_ID, ROLE_NAME, ROLE_KEY, ROLE_SORT, DATA_SCOPE, MENU_CHECK_STRICTLY, DEPT_CHECK_STRICTLY, STATUS, DEL_FLAG, CREATE_BY, CREATE_TIME, REMARK) +SELECT 103, '教研室', 'RESEARCH_OFFICE', 11, '3', 1, 1, '0', '0', 'admin', SYSDATE, '教研室:查看并一审本室调课申请' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SYS_ROLE WHERE ROLE_KEY = 'RESEARCH_OFFICE'); +SET IDENTITY_INSERT SYS_ROLE OFF; + +INSERT INTO SYS_ROLE_MENU (ROLE_ID, MENU_ID) +SELECT r.ROLE_ID, m.MENU_ID +FROM SYS_ROLE r +CROSS JOIN SYS_ROLE_MENU m +WHERE r.ROLE_KEY = 'RESEARCH_OFFICE' + AND m.ROLE_ID = (SELECT ROLE_ID FROM SYS_ROLE WHERE ROLE_KEY = 'TEACHER') + AND NOT EXISTS ( + SELECT 1 FROM SYS_ROLE_MENU x WHERE x.ROLE_ID = r.ROLE_ID AND x.MENU_ID = m.MENU_ID + ); diff --git a/deploy/build-frontend.bat b/deploy/build-frontend.bat new file mode 100644 index 00000000..4a625fbd --- /dev/null +++ b/deploy/build-frontend.bat @@ -0,0 +1,8 @@ +@echo off +cd /d D:\IDE-WorkSpace\New-JW\frontend +if exist "%ProgramFiles%\nodejs\npm.cmd" ( + "%ProgramFiles%\nodejs\npm.cmd" run build:prod +) else ( + npm run build:prod +) +echo Frontend dist updated: D:\IDE-WorkSpace\New-JW\frontend\dist diff --git a/deploy/logs/backend.err.log b/deploy/logs/backend.err.log new file mode 100644 index 00000000..e69de29b diff --git a/deploy/logs/backend.out.log b/deploy/logs/backend.out.log new file mode 100644 index 00000000..95d98ecb --- /dev/null +++ b/deploy/logs/backend.out.log @@ -0,0 +1,533 @@ +Application Version: 3.9.2 +Spring Boot Version: 4.0.6 +//////////////////////////////////////////////////////////////////// +// ʼ 崻 BUG // +//////////////////////////////////////////////////////////////////// +18:01:06.119 [background-preinit] INFO o.h.v.i.util.Version - [,18] - HV000001: Hibernate Validator 9.0.1.Final +18:01:06.222 [main] INFO c.r.RoomRootApplication - [logStarting,54] - Starting RoomRootApplication using Java 17.0.0.1 with PID 31428 (D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\target\roomroot-admin.jar started by 24594 in D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\target) +18:01:06.224 [main] DEBUG c.r.RoomRootApplication - [logStarting,55] - Running with Spring Boot v4.0.6, Spring v7.0.7 +18:01:06.227 [main] INFO c.r.RoomRootApplication - [logStartupProfileInfo,658] - The following 1 profile is active: "druid" +18:01:09.655 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysConfigMapper' and 'com.roomroot.system.mapper.SysConfigMapper' mapperInterface. Bean already defined with the same name! +18:01:09.656 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.roomroot.system.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! +18:01:09.657 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysDictDataMapper' and 'com.roomroot.system.mapper.SysDictDataMapper' mapperInterface. Bean already defined with the same name! +18:01:09.658 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysDictTypeMapper' and 'com.roomroot.system.mapper.SysDictTypeMapper' mapperInterface. Bean already defined with the same name! +18:01:09.659 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysLogininforMapper' and 'com.roomroot.system.mapper.SysLogininforMapper' mapperInterface. Bean already defined with the same name! +18:01:09.660 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.roomroot.system.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! +18:01:09.661 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysNoticeMapper' and 'com.roomroot.system.mapper.SysNoticeMapper' mapperInterface. Bean already defined with the same name! +18:01:09.662 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysNoticeReadMapper' and 'com.roomroot.system.mapper.SysNoticeReadMapper' mapperInterface. Bean already defined with the same name! +18:01:09.662 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysOperLogMapper' and 'com.roomroot.system.mapper.SysOperLogMapper' mapperInterface. Bean already defined with the same name! +18:01:09.663 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysPostMapper' and 'com.roomroot.system.mapper.SysPostMapper' mapperInterface. Bean already defined with the same name! +18:01:09.664 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysRoleDeptMapper' and 'com.roomroot.system.mapper.SysRoleDeptMapper' mapperInterface. Bean already defined with the same name! +18:01:09.665 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.roomroot.system.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! +18:01:09.666 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.roomroot.system.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! +18:01:09.667 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysUserMapper' and 'com.roomroot.system.mapper.SysUserMapper' mapperInterface. Bean already defined with the same name! +18:01:09.669 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysUserPostMapper' and 'com.roomroot.system.mapper.SysUserPostMapper' mapperInterface. Bean already defined with the same name! +18:01:09.670 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.roomroot.system.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! +18:01:09.671 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysJobLogMapper' and 'com.roomroot.quartz.mapper.SysJobLogMapper' mapperInterface. Bean already defined with the same name! +18:01:09.672 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'sysJobMapper' and 'com.roomroot.quartz.mapper.SysJobMapper' mapperInterface. Bean already defined with the same name! +18:01:09.674 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'genTableColumnMapper' and 'com.roomroot.generator.mapper.GenTableColumnMapper' mapperInterface. Bean already defined with the same name! +18:01:09.674 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'genTableMapper' and 'com.roomroot.generator.mapper.GenTableMapper' mapperInterface. Bean already defined with the same name! +18:01:09.675 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'accountManagementAuthorizationMapper' and 'com.roomroot.jwgl.mapper.AccountManagementAuthorizationMapper' mapperInterface. Bean already defined with the same name! +18:01:09.676 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'accountManagementMapper' and 'com.roomroot.jwgl.mapper.AccountManagementMapper' mapperInterface. Bean already defined with the same name! +18:01:09.677 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'BCKTJXRZMapper' and 'com.roomroot.jwgl.mapper.BCKTJXRZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.677 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'BCKTJXRZSKJYMapper' and 'com.roomroot.jwgl.mapper.BCKTJXRZSKJYMapper' mapperInterface. Bean already defined with the same name! +18:01:09.678 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'BZLBMapper' and 'com.roomroot.jwgl.mapper.BZLBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.679 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'BZTGMXMapper' and 'com.roomroot.jwgl.mapper.BZTGMXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.680 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'buildMapper' and 'com.roomroot.jwgl.mapper.BuildMapper' mapperInterface. Bean already defined with the same name! +18:01:09.681 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'classRoomCalendarMapper' and 'com.roomroot.jwgl.mapper.ClassRoomCalendarMapper' mapperInterface. Bean already defined with the same name! +18:01:09.681 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'classRoomLessonMapper' and 'com.roomroot.jwgl.mapper.ClassRoomLessonMapper' mapperInterface. Bean already defined with the same name! +18:01:09.681 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'classRoomMapper' and 'com.roomroot.jwgl.mapper.ClassRoomMapper' mapperInterface. Bean already defined with the same name! +18:01:09.683 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'classSemesterCalendarMapper' and 'com.roomroot.jwgl.mapper.ClassSemesterCalendarMapper' mapperInterface. Bean already defined with the same name! +18:01:09.684 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'classSemesterMapper' and 'com.roomroot.jwgl.mapper.ClassSemesterMapper' mapperInterface. Bean already defined with the same name! +18:01:09.685 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DBVersionMapper' and 'com.roomroot.jwgl.mapper.DBVersionMapper' mapperInterface. Bean already defined with the same name! +18:01:09.686 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DDDLTBBMapper' and 'com.roomroot.jwgl.mapper.DDDLTBBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.687 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DKSQBZMXMapper' and 'com.roomroot.jwgl.mapper.DKSQBZMXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.688 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DKSQFZJYMapper' and 'com.roomroot.jwgl.mapper.DKSQFZJYMapper' mapperInterface. Bean already defined with the same name! +18:01:09.689 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DKSQJSMapper' and 'com.roomroot.jwgl.mapper.DKSQJSMapper' mapperInterface. Bean already defined with the same name! +18:01:09.690 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DKSQXYDMapper' and 'com.roomroot.jwgl.mapper.DKSQXYDMapper' mapperInterface. Bean already defined with the same name! +18:01:09.691 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DLJLBMapper' and 'com.roomroot.jwgl.mapper.DLJLBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.692 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DLXXBMapper' and 'com.roomroot.jwgl.mapper.DLXXBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.693 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'DXJSGZMapper' and 'com.roomroot.jwgl.mapper.DXJSGZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.694 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'dictDataMapper' and 'com.roomroot.jwgl.mapper.DictDataMapper' mapperInterface. Bean already defined with the same name! +18:01:09.695 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'dictTypeMapper' and 'com.roomroot.jwgl.mapper.DictTypeMapper' mapperInterface. Bean already defined with the same name! +18:01:09.696 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'GKLDLBZBBMapper' and 'com.roomroot.jwgl.mapper.GKLDLBZBBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.697 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JGMapper' and 'com.roomroot.jwgl.mapper.JGMapper' mapperInterface. Bean already defined with the same name! +18:01:09.698 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JSZWKSFBZMapper' and 'com.roomroot.jwgl.mapper.JSZWKSFBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.698 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JXRZJYKSBZMapper' and 'com.roomroot.jwgl.mapper.JXRZJYKSBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.699 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JXRZKSBZSPBMapper' and 'com.roomroot.jwgl.mapper.JXRZKSBZSPBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.700 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JXRZXYXXQKMapper' and 'com.roomroot.jwgl.mapper.JXRZXYXXQKMapper' mapperInterface. Bean already defined with the same name! +18:01:09.701 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JXSSJHTJBMapper' and 'com.roomroot.jwgl.mapper.JXSSJHTJBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.702 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYBMapper' and 'com.roomroot.jwgl.mapper.JYBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.704 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYKSBZMapper' and 'com.roomroot.jwgl.mapper.JYKSBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.704 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYNZKSFMapper' and 'com.roomroot.jwgl.mapper.JYNZKSFMapper' mapperInterface. Bean already defined with the same name! +18:01:09.705 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYSBMapper' and 'com.roomroot.jwgl.mapper.JYSBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.706 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYSCKCBMapper' and 'com.roomroot.jwgl.mapper.JYSCKCBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.707 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JYSXMapper' and 'com.roomroot.jwgl.mapper.JYSXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.707 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'JZGZLMapper' and 'com.roomroot.jwgl.mapper.JZGZLMapper' mapperInterface. Bean already defined with the same name! +18:01:09.708 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KBMapper' and 'com.roomroot.jwgl.mapper.KBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.708 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KCBBZMXMapper' and 'com.roomroot.jwgl.mapper.KCBBZMXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.708 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KCBMBBMapper' and 'com.roomroot.jwgl.mapper.KCBMBBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.709 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KCBMapper' and 'com.roomroot.jwgl.mapper.KCBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.710 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KCBZMapper' and 'com.roomroot.jwgl.mapper.KCBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.711 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KCJXYX_CZRZMapper' and 'com.roomroot.jwgl.mapper.KCJXYX_CZRZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.711 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KLXBMapper' and 'com.roomroot.jwgl.mapper.KLXBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.712 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KSBZXMMapper' and 'com.roomroot.jwgl.mapper.KSBZXMMapper' mapperInterface. Bean already defined with the same name! +18:01:09.713 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KSFBZMapper' and 'com.roomroot.jwgl.mapper.KSFBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.714 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KSHBZMapper' and 'com.roomroot.jwgl.mapper.KSHBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.715 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KSTJBMapper' and 'com.roomroot.jwgl.mapper.KSTJBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.716 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KSXSFAMapper' and 'com.roomroot.jwgl.mapper.KSXSFAMapper' mapperInterface. Bean already defined with the same name! +18:01:09.716 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KTBZMapper' and 'com.roomroot.jwgl.mapper.KTBZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.716 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KTRZXYKQBMapper' and 'com.roomroot.jwgl.mapper.KTRZXYKQBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.716 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'KYKYJFBMapper' and 'com.roomroot.jwgl.mapper.KYKYJFBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.717 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'LBZYGLPTMapper' and 'com.roomroot.jwgl.mapper.LBZYGLPTMapper' mapperInterface. Bean already defined with the same name! +18:01:09.717 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'memberOnlineInfoMapper' and 'com.roomroot.jwgl.mapper.MemberOnlineInfoMapper' mapperInterface. Bean already defined with the same name! +18:01:09.717 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'NDZHPDJYMapper' and 'com.roomroot.jwgl.mapper.NDZHPDJYMapper' mapperInterface. Bean already defined with the same name! +18:01:09.718 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'NZKSFMapper' and 'com.roomroot.jwgl.mapper.NZKSFMapper' mapperInterface. Bean already defined with the same name! +18:01:09.718 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'noticeAnnouncementMapper' and 'com.roomroot.jwgl.mapper.NoticeAnnouncementMapper' mapperInterface. Bean already defined with the same name! +18:01:09.719 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'notificationLogMapper' and 'com.roomroot.jwgl.mapper.NotificationLogMapper' mapperInterface. Bean already defined with the same name! +18:01:09.719 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'officeTaskBookMapper' and 'com.roomroot.jwgl.mapper.OfficeTaskBookMapper' mapperInterface. Bean already defined with the same name! +18:01:09.719 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'operationAnalysisMapper' and 'com.roomroot.jwgl.mapper.OperationAnalysisMapper' mapperInterface. Bean already defined with the same name! +18:01:09.720 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'operationLogMapper' and 'com.roomroot.jwgl.mapper.OperationLogMapper' mapperInterface. Bean already defined with the same name! +18:01:09.721 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'QJKTBMapper' and 'com.roomroot.jwgl.mapper.QJKTBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.721 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'QJXYBMapper' and 'com.roomroot.jwgl.mapper.QJXYBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.722 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSDKSQMapper' and 'com.roomroot.jwgl.mapper.SSDKSQMapper' mapperInterface. Bean already defined with the same name! +18:01:09.723 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSDKSQSPMapper' and 'com.roomroot.jwgl.mapper.SSDKSQSPMapper' mapperInterface. Bean already defined with the same name! +18:01:09.723 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSJGCMMapper' and 'com.roomroot.jwgl.mapper.SSJGCMMapper' mapperInterface. Bean already defined with the same name! +18:01:09.724 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSJGJYSMapper' and 'com.roomroot.jwgl.mapper.SSJGJYSMapper' mapperInterface. Bean already defined with the same name! +18:01:09.724 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSJGMapper' and 'com.roomroot.jwgl.mapper.SSJGMapper' mapperInterface. Bean already defined with the same name! +18:01:09.725 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSJGXYDMapper' and 'com.roomroot.jwgl.mapper.SSJGXYDMapper' mapperInterface. Bean already defined with the same name! +18:01:09.725 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCBFZJYMapper' and 'com.roomroot.jwgl.mapper.SSKCBFZJYMapper' mapperInterface. Bean already defined with the same name! +18:01:09.726 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCBJSMapper' and 'com.roomroot.jwgl.mapper.SSKCBJSMapper' mapperInterface. Bean already defined with the same name! +18:01:09.726 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCBMapper' and 'com.roomroot.jwgl.mapper.SSKCBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.726 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCBXYDMapper' and 'com.roomroot.jwgl.mapper.SSKCBXYDMapper' mapperInterface. Bean already defined with the same name! +18:01:09.727 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCB_RZMapper' and 'com.roomroot.jwgl.mapper.SSKCB_RZMapper' mapperInterface. Bean already defined with the same name! +18:01:09.727 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCMapper' and 'com.roomroot.jwgl.mapper.SSKCMapper' mapperInterface. Bean already defined with the same name! +18:01:09.728 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSKCXYDMapper' and 'com.roomroot.jwgl.mapper.SSKCXYDMapper' mapperInterface. Bean already defined with the same name! +18:01:09.728 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSOAppInfoMapper' and 'com.roomroot.jwgl.mapper.SSOAppInfoMapper' mapperInterface. Bean already defined with the same name! +18:01:09.728 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSOUserAuthOperateMapper' and 'com.roomroot.jwgl.mapper.SSOUserAuthOperateMapper' mapperInterface. Bean already defined with the same name! +18:01:09.729 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'SSOUserAuthSessionMapper' and 'com.roomroot.jwgl.mapper.SSOUserAuthSessionMapper' mapperInterface. Bean already defined with the same name! +18:01:09.729 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'scheduleAdjustStrategyMapper' and 'com.roomroot.jwgl.mapper.ScheduleAdjustStrategyMapper' mapperInterface. Bean already defined with the same name! +18:01:09.730 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'semesterCalendarMapper' and 'com.roomroot.jwgl.mapper.SemesterCalendarMapper' mapperInterface. Bean already defined with the same name! +18:01:09.730 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'semesterMapper' and 'com.roomroot.jwgl.mapper.SemesterMapper' mapperInterface. Bean already defined with the same name! +18:01:09.730 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'studentTeamOutputScheduleMapper' and 'com.roomroot.jwgl.mapper.StudentTeamOutputScheduleMapper' mapperInterface. Bean already defined with the same name! +18:01:09.731 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'studentTeamTaskMapper' and 'com.roomroot.jwgl.mapper.StudentTeamTaskMapper' mapperInterface. Bean already defined with the same name! +18:01:09.731 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'systemInitializationMapper' and 'com.roomroot.jwgl.mapper.SystemInitializationMapper' mapperInterface. Bean already defined with the same name! +18:01:09.732 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'TCKGLYDLBMapper' and 'com.roomroot.jwgl.mapper.TCKGLYDLBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.732 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'TCKGLYMapper' and 'com.roomroot.jwgl.mapper.TCKGLYMapper' mapperInterface. Bean already defined with the same name! +18:01:09.733 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'TGBMapper' and 'com.roomroot.jwgl.mapper.TGBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.733 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'TGYHXXMapper' and 'com.roomroot.jwgl.mapper.TGYHXXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.734 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teacherHoursMapper' and 'com.roomroot.jwgl.mapper.TeacherHoursMapper' mapperInterface. Bean already defined with the same name! +18:01:09.735 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teachingMaterialMapper' and 'com.roomroot.jwgl.mapper.TeachingMaterialMapper' mapperInterface. Bean already defined with the same name! +18:01:09.736 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teachingPlanMapper' and 'com.roomroot.jwgl.mapper.TeachingPlanMapper' mapperInterface. Bean already defined with the same name! +18:01:09.736 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teachingStockDetailMapper' and 'com.roomroot.jwgl.mapper.TeachingStockDetailMapper' mapperInterface. Bean already defined with the same name! +18:01:09.737 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teachingStockMapper' and 'com.roomroot.jwgl.mapper.TeachingStockMapper' mapperInterface. Bean already defined with the same name! +18:01:09.738 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'teachingTaskMapper' and 'com.roomroot.jwgl.mapper.TeachingTaskMapper' mapperInterface. Bean already defined with the same name! +18:01:09.739 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'WJMapper' and 'com.roomroot.jwgl.mapper.WJMapper' mapperInterface. Bean already defined with the same name! +18:01:09.739 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'WSRYZCBMapper' and 'com.roomroot.jwgl.mapper.WSRYZCBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.739 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'WSSXBMapper' and 'com.roomroot.jwgl.mapper.WSSXBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.740 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'WSWDBMapper' and 'com.roomroot.jwgl.mapper.WSWDBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.740 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XKZYXXMapper' and 'com.roomroot.jwgl.mapper.XKZYXXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.741 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XQMapper' and 'com.roomroot.jwgl.mapper.XQMapper' mapperInterface. Bean already defined with the same name! +18:01:09.742 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYCPCPXMBMapper' and 'com.roomroot.jwgl.mapper.XYCPCPXMBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.743 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYDBMapper' and 'com.roomroot.jwgl.mapper.XYDBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.744 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYDQBMapper' and 'com.roomroot.jwgl.mapper.XYDQBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.745 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYJXQJBMapper' and 'com.roomroot.jwgl.mapper.XYJXQJBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.745 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYKCCJMapper' and 'com.roomroot.jwgl.mapper.XYKCCJMapper' mapperInterface. Bean already defined with the same name! +18:01:09.746 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYKCGCCJMapper' and 'com.roomroot.jwgl.mapper.XYKCGCCJMapper' mapperInterface. Bean already defined with the same name! +18:01:09.747 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYMYDCPXMMapper' and 'com.roomroot.jwgl.mapper.XYMYDCPXMMapper' mapperInterface. Bean already defined with the same name! +18:01:09.748 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYQJSPBMapper' and 'com.roomroot.jwgl.mapper.XYQJSPBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.748 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYXJYDSQBMapper' and 'com.roomroot.jwgl.mapper.XYXJYDSQBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.748 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYXJYJJGBMapper' and 'com.roomroot.jwgl.mapper.XYXJYJJGBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.749 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYXJYJTJBMapper' and 'com.roomroot.jwgl.mapper.XYXJYJTJBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.749 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'XYXXMapper' and 'com.roomroot.jwgl.mapper.XYXXMapper' mapperInterface. Bean already defined with the same name! +18:01:09.750 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'YCBMapper' and 'com.roomroot.jwgl.mapper.YCBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.751 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'YJFKBMapper' and 'com.roomroot.jwgl.mapper.YJFKBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.751 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'ZYBMapper' and 'com.roomroot.jwgl.mapper.ZYBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.752 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - Skipping MapperFactoryBean with name 'ZYJXJHBMapper' and 'com.roomroot.jwgl.mapper.ZYJXJHBMapper' mapperInterface. Bean already defined with the same name! +18:01:09.753 [main] WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - No MyBatis mapper was found in '[com.roomroot.**.mapper]' package. Please check your configuration. +18:01:10.045 [main] WARN o.s.c.a.MergedAnnotation - [log,64] - Failed to introspect meta-annotation @AutoConfigureAfter on class com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration: java.lang.TypeNotPresentException: Type org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration not present +18:01:13.826 [main] INFO o.a.c.h.Http11NioProtocol - [log,168] - Initializing ProtocolHandler ["http-nio-8080"] +18:01:13.829 [main] INFO o.a.c.c.StandardService - [log,168] - Starting service [Tomcat] +18:01:13.830 [main] INFO o.a.c.c.StandardEngine - [log,168] - Starting Servlet engine: [Apache Tomcat/11.0.21] +18:01:16.095 [main] DEBUG c.r.f.s.f.JwtAuthenticationTokenFilter - [init,236] - Filter 'jwtAuthenticationTokenFilter' configured for use +18:01:17.040 [main] INFO c.a.d.p.DruidDataSource - [init,865] - {dataSource-1} inited +18:01:18.282 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysConfig". +18:01:18.297 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysConfig ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.367 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysDept". +18:01:18.368 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysDept ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.406 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysDictData". +18:01:18.408 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysDictData ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.435 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysDictType". +18:01:18.437 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysDictType ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.518 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysMenu". +18:01:18.520 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysMenu ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.548 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysNotice". +18:01:18.549 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysNotice ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.582 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysNoticeRead". +18:01:18.583 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysNoticeRead ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.605 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysOperLog". +18:01:18.607 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysOperLog ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.631 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysPost". +18:01:18.633 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysPost ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.655 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysRoleDept". +18:01:18.657 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysRoleDept ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.678 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysRole". +18:01:18.679 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysRole ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.698 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysRoleMenu". +18:01:18.700 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysRoleMenu ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.727 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.common.core.domain.entity.SysUser". +18:01:18.729 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.common.core.domain.entity.SysUser ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.746 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysUserPost". +18:01:18.748 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysUserPost ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.763 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.system.domain.SysUserRole". +18:01:18.764 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.system.domain.SysUserRole ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.782 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.quartz.domain.SysJobLog". +18:01:18.784 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.quartz.domain.SysJobLog ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.802 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.quartz.domain.SysJob". +18:01:18.804 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.quartz.domain.SysJob ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.829 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.generator.domain.GenTableColumn". +18:01:18.830 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.generator.domain.GenTableColumn ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:18.859 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.generator.domain.GenTable". +18:01:18.861 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.generator.domain.GenTable ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:19.367 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.DDDLTBB". +18:01:19.370 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.DDDLTBB ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:19.621 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.JG". +18:01:19.623 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.JG ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:20.159 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.KLXB". +18:01:20.162 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.KLXB ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:20.390 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.MemberOnlineInfo". +18:01:20.391 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.MemberOnlineInfo ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:21.115 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.SSKCXYD". +18:01:21.117 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.SSKCXYD ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. +18:01:21.164 [main] WARN c.b.m.c.m.TableInfoHelper - [initTableFields,376] - Can not find table primary key in Class: "com.roomroot.jwgl.entity.SSOUserAuthSession". +18:01:21.166 [main] WARN c.b.m.c.i.DefaultSqlInjector - [getMethodList,56] - class com.roomroot.jwgl.entity.SSOUserAuthSession ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.7 +18:01:22.643 [main] DEBUG c.r.s.m.S.selectConfigList - [debug,135] - ==> Preparing: select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark from sys_config +18:01:22.963 [main] DEBUG c.r.s.m.S.selectConfigList - [debug,135] - ==> Parameters: +18:01:22.988 [main] DEBUG c.r.s.m.S.selectConfigList - [debug,135] - <== Total: 9 +18:01:28.576 [main] DEBUG c.r.s.m.S.selectDictDataList - [debug,135] - ==> Preparing: select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark from sys_dict_data WHERE status = ? order by dict_sort asc +18:01:28.679 [main] DEBUG c.r.s.m.S.selectDictDataList - [debug,135] - ==> Parameters: 0(String) +18:01:28.748 [main] DEBUG c.r.s.m.S.selectDictDataList - [debug,135] - <== Total: 579 +18:01:29.782 [main] INFO o.q.c.SchedulerSignalerImpl - [,62] - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +18:01:29.782 [main] INFO o.q.c.QuartzScheduler - [,224] - Quartz Scheduler v2.5.2 created. +18:01:29.787 [main] INFO o.q.s.RAMJobStore - [initialize,152] - RAMJobStore initialized. +18:01:29.788 [main] INFO o.q.c.QuartzScheduler - [initialize,289] - Scheduler meta-data: Quartz Scheduler (v2.5.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +18:01:29.789 [main] INFO o.q.c.QuartzScheduler - [setJobFactory,2250] - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3eea7c4b +18:01:29.817 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - ==> Preparing: select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark from sys_job +18:01:29.820 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - ==> Parameters: +18:01:29.823 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - <== Total: 3 +18:01:32.169 [main] INFO o.a.c.h.Http11NioProtocol - [log,168] - Starting ProtocolHandler ["http-nio-8080"] +18:01:32.232 [main] INFO o.q.c.QuartzScheduler - [start,541] - Scheduler quartzScheduler_$_NON_CLUSTERED started. +18:01:32.255 [main] INFO c.r.RoomRootApplication - [logStarted,60] - Started RoomRootApplication in 26.745 seconds (process running for 28.232) +18:01:32.274 [main] WARN o.s.c.e.SpringDocAppInitializer - [init,83] - SpringDoc /v3/api-docs endpoint is enabled by default. To disable it in production, set the property 'springdoc.api-docs.enabled=false' +(????)?? ɹ ?(??`?)? + +18:01:32.539 [http-nio-8080-exec-1] INFO o.a.c.c.C.[.[.[/api] - [log,168] - Initializing Spring DispatcherServlet 'dispatcherServlet' +18:07:16.425 [http-nio-8080-exec-6] DEBUG c.r.s.m.S.selectMenuTreeAll - [debug,135] - ==> Preparing: select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0 order by m.parent_id, m.order_num +18:07:16.436 [http-nio-8080-exec-6] DEBUG c.r.s.m.S.selectMenuTreeAll - [debug,135] - ==> Parameters: +18:07:16.451 [http-nio-8080-exec-6] DEBUG c.r.s.m.S.selectMenuTreeAll - [debug,135] - <== Total: 62 +18:07:16.769 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList_mpCount - [debug,135] - ==> Preparing: SELECT COUNT(*) AS total FROM ѧ +18:07:16.772 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList_mpCount - [debug,135] - ==> Parameters: +18:07:16.774 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList_mpCount - [debug,135] - <== Total: 1 +18:07:16.785 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList - [debug,135] - ==> Preparing: SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT , ǰѧ, ѧ, , β, ʱϵ, ֹ, սɼ, 쵼˵, β_Ա, β_ʱ, β_, , β_, , λ, JSONZD, ʱͳʱ FROM ѧ ORDER BY DESC ) TMP WHERE ROWNUM <=?) WHERE ROW_ID > ? +18:07:16.792 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList - [debug,135] - ==> Parameters: 100(Long), 0(Long) +18:07:16.799 [http-nio-8080-exec-7] DEBUG c.r.j.m.S.selectPageList - [debug,135] - <== Total: 6 +18:07:16.937 [http-nio-8080-exec-9] DEBUG c.r.s.m.S.selectNoticeListWithReadStatus - [debug,135] - ==> Preparing: select n.notice_id as noticeId, n.notice_title as noticeTitle, n.notice_type as noticeType, n.status, n.create_by as createBy, n.create_time as createTime, case when r.notice_id is not null then true else false end as isRead from sys_notice n left join sys_notice_read r on r.notice_id = n.notice_id and r.user_id = ? where n.status = '0' order by n.notice_id desc limit ? +18:07:16.948 [http-nio-8080-exec-10] DEBUG c.r.s.m.S.selectLogininforList - [debug,135] - ==> Preparing: select info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time from sys_logininfor order by login_time desc +18:07:16.951 [http-nio-8080-exec-9] DEBUG c.r.s.m.S.selectNoticeListWithReadStatus - [debug,135] - ==> Parameters: 1(Long), 5(Integer) +18:07:16.952 [http-nio-8080-exec-10] DEBUG c.r.s.m.S.selectLogininforList - [debug,135] - ==> Parameters: +18:07:16.955 [http-nio-8080-exec-9] DEBUG c.r.s.m.S.selectNoticeListWithReadStatus - [debug,135] - <== Total: 2 +18:07:16.967 [http-nio-8080-exec-10] DEBUG c.r.s.m.S.selectLogininforList - [debug,135] - <== Total: 176 +18:07:16.983 [http-nio-8080-exec-8] DEBUG c.r.s.m.S.selectNoticeList - [debug,135] - ==> Preparing: select notice_id, notice_title, notice_type, TO_CHAR(notice_content) AS notice_content, status, create_by, create_time, update_by, update_time, remark from sys_notice order by notice_id desc +18:07:16.986 [http-nio-8080-exec-8] DEBUG c.r.s.m.S.selectNoticeList - [debug,135] - ==> Parameters: +18:07:16.989 [http-nio-8080-exec-8] DEBUG c.r.s.m.S.selectNoticeList - [debug,135] - <== Total: 2 +18:07:43.315 [lettuce-nioEventLoop-4-1] INFO i.l.c.p.CommandHandler - [log,217] - null Unexpected exception during request: java.net.SocketException: Connection reset +java.net.SocketException: Connection reset + at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) + at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) + at io.netty.buffer.AdaptivePoolingAllocator$AdaptiveByteBuf.setBytes(AdaptivePoolingAllocator.java:2002) + at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1139) + at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) + at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:161) + at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.handle(AbstractNioChannel.java:445) + at io.netty.channel.nio.NioIoHandler$DefaultNioRegistration.handle(NioIoHandler.java:388) + at io.netty.channel.nio.NioIoHandler.processSelectedKey(NioIoHandler.java:596) + at io.netty.channel.nio.NioIoHandler.processSelectedKeysOptimized(NioIoHandler.java:571) + at io.netty.channel.nio.NioIoHandler.processSelectedKeys(NioIoHandler.java:512) + at io.netty.channel.nio.NioIoHandler.run(NioIoHandler.java:484) + at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:225) + at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:196) + at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1195) + at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) + at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) + at java.base/java.lang.Thread.run(Thread.java:833) +18:07:43.449 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/127.0.0.1:6379 +18:07:43.456 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:07:52.547 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:07:52.555 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:08:00.840 [lettuce-eventExecutorLoop-1-10] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:08:00.843 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:08:14.370 [http-nio-8080-exec-11] ERROR c.r.f.w.s.TokenService - [getLoginUser,80] - ȡûϢ쳣'Redis command timed out' +18:08:17.242 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:08:17.245 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:08:24.401 [http-nio-8080-exec-12] ERROR c.r.f.w.s.TokenService - [getLoginUser,80] - ȡûϢ쳣'Redis command timed out' +18:08:47.350 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:08:47.351 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:09:17.443 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:09:17.445 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:09:47.536 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:09:47.540 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:10:17.637 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:10:17.638 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:10:47.736 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:10:47.738 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:11:17.839 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:11:17.841 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:11:47.936 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:11:47.937 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:12:18.045 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:12:18.047 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:12:48.140 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:12:48.143 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:13:18.250 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:13:18.252 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:13:48.339 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:13:48.344 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:14:18.436 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:14:18.439 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:14:48.537 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:14:48.538 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:15:18.637 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:15:18.649 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:15:48.736 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:15:48.737 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:16:18.837 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:16:18.838 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:16:48.947 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:16:48.949 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:17:19.037 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:17:19.039 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:17:49.137 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:17:49.139 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:18:19.245 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:18:19.248 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:18:49.336 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:18:49.337 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:19:19.437 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:19:19.441 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:19:49.537 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:19:49.538 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:20:19.636 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:20:19.641 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:20:49.738 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:20:49.742 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:21:19.837 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:21:19.840 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:21:49.936 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:21:49.936 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:22:20.036 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:22:20.042 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:22:50.137 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:22:50.138 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:23:20.237 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:23:20.239 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:23:50.337 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:23:50.339 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:24:20.436 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:24:20.439 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:24:50.536 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:24:50.537 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:25:20.638 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:25:20.641 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:25:50.737 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:25:50.741 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:26:20.837 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:26:20.838 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:26:50.937 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:26:50.939 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:27:21.037 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:27:21.039 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:27:51.136 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:27:51.137 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:28:21.236 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:28:21.237 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:28:51.337 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:28:51.338 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:29:21.437 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:29:21.438 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:29:51.537 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:29:51.541 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:30:21.636 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:30:21.638 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:30:51.736 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:30:51.739 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:31:21.836 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:31:21.838 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:31:51.937 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:31:51.939 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:32:22.036 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:32:22.039 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:32:52.137 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:32:52.140 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:33:22.237 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:33:22.239 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:33:52.337 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:33:52.337 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:34:22.436 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:34:22.437 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:34:52.537 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:34:52.538 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:35:22.636 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:35:22.640 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:35:52.736 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:35:52.737 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:36:22.837 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:36:22.838 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:36:52.936 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:36:52.938 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:37:23.037 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:37:23.038 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:37:53.136 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:37:53.138 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:38:23.237 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:38:23.239 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:38:53.340 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:38:53.342 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:39:23.437 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:39:23.439 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:39:53.536 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:39:53.538 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:40:23.637 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:40:23.638 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:40:53.737 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:40:53.739 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:41:23.837 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:41:23.838 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:41:53.936 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:41:53.939 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:42:24.037 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:42:24.040 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:42:54.136 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:42:54.137 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:43:24.237 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:43:24.239 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:43:54.344 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:43:54.345 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:44:24.436 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:44:24.437 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:44:54.536 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:44:54.538 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:45:24.637 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:45:24.642 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:45:54.737 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:45:54.743 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:46:24.836 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:46:24.839 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:46:54.937 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:46:54.939 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:47:25.037 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:47:25.039 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:47:55.136 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:47:55.142 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:48:25.237 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:48:25.239 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:48:55.337 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:48:55.342 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:49:25.436 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:49:25.438 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:49:55.536 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:49:55.538 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:50:25.637 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:50:25.642 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:50:55.737 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:50:55.738 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:51:25.837 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:51:25.839 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:51:55.936 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:51:55.938 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:52:26.037 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:52:26.039 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:52:56.136 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:52:56.137 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:53:26.237 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:53:26.238 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:53:56.337 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:53:56.337 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:54:26.436 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:54:26.438 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:54:56.536 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:54:56.537 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:55:26.637 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:55:26.639 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:55:56.736 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:55:56.737 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:56:26.836 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:56:26.841 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:56:56.937 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:56:56.939 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:57:27.037 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:57:27.039 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:57:57.136 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:57:57.138 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:58:27.236 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:58:27.238 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:58:57.336 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:58:57.338 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:59:27.436 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:59:27.441 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +18:59:57.537 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +18:59:57.540 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:00:27.636 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:00:27.638 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:00:57.737 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:00:57.739 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:01:27.839 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:01:27.842 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:01:57.937 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:01:57.938 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:02:28.036 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:02:28.037 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:02:58.136 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:02:58.137 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:03:28.237 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:03:28.239 [lettuce-nioEventLoop-4-14] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:03:58.336 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:03:58.338 [lettuce-nioEventLoop-4-15] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:04:28.437 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:04:28.439 [lettuce-nioEventLoop-4-16] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:04:58.536 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:04:58.538 [lettuce-nioEventLoop-4-1] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:05:28.637 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:05:28.640 [lettuce-nioEventLoop-4-2] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:05:58.737 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:05:58.738 [lettuce-nioEventLoop-4-3] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:06:28.843 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:06:28.843 [lettuce-nioEventLoop-4-4] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:06:58.936 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:06:58.942 [lettuce-nioEventLoop-4-5] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:07:29.036 [lettuce-eventExecutorLoop-1-9] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:07:29.041 [lettuce-nioEventLoop-4-6] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:07:59.137 [lettuce-eventExecutorLoop-1-11] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:07:59.139 [lettuce-nioEventLoop-4-7] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:08:29.237 [lettuce-eventExecutorLoop-1-13] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:08:29.239 [lettuce-nioEventLoop-4-8] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:08:59.337 [lettuce-eventExecutorLoop-1-15] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:08:59.338 [lettuce-nioEventLoop-4-9] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:09:29.436 [lettuce-eventExecutorLoop-1-1] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:09:29.441 [lettuce-nioEventLoop-4-10] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:09:59.536 [lettuce-eventExecutorLoop-1-3] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:09:59.538 [lettuce-nioEventLoop-4-11] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:10:29.637 [lettuce-eventExecutorLoop-1-5] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:10:29.642 [lettuce-nioEventLoop-4-12] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 +19:10:59.736 [lettuce-eventExecutorLoop-1-7] INFO i.l.c.p.ConnectionWatchdog - [log,171] - Reconnecting, last destination was localhost/:6379 +19:10:59.739 [lettuce-nioEventLoop-4-13] WARN i.l.c.p.ConnectionWatchdog - [log,151] - Cannot reconnect to [localhost/:6379]: Connection refused: no further information: localhost/127.0.0.1:6379 diff --git a/deploy/nginx.conf b/deploy/nginx.conf new file mode 100644 index 00000000..66d605c6 --- /dev/null +++ b/deploy/nginx.conf @@ -0,0 +1,60 @@ +worker_processes 1; +error_log logs/error.log; +pid logs/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include D:/nginx/conf/mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + client_max_body_size 50m; + + gzip on; + gzip_min_length 1024; + gzip_comp_level 6; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; + gzip_vary on; + + server { + listen 80; + server_name 10.1.1.157 localhost 127.0.0.1; + charset utf-8; + + root D:/IDE-WorkSpace/New-JW/frontend/dist; + index index.html; + + location /prod-api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_connect_timeout 30s; + proxy_read_timeout 300s; + proxy_pass http://127.0.0.1:8080/api/; + } + + location /api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_connect_timeout 30s; + proxy_read_timeout 300s; + proxy_pass http://127.0.0.1:8080/api/; + } + + location / { + try_files $uri $uri/ /index.html; + } + } +} diff --git a/deploy/start-backend.bat b/deploy/start-backend.bat new file mode 100644 index 00000000..25596a7c --- /dev/null +++ b/deploy/start-backend.bat @@ -0,0 +1,22 @@ +@echo off +setlocal +set JAR=D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\target\roomroot-admin.jar +set JAVA_EXE=D:\Java\jdk-17.0.0.1\bin\java.exe +set LOGDIR=D:\IDE-WorkSpace\New-JW\deploy\logs +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +if not exist "%JAR%" ( + echo JAR not found: %JAR% + exit /b 1 +) +if not exist "%LOGDIR%" mkdir "%LOGDIR%" + +for /f "tokens=1" %%p in ('"D:\Java\jdk-17.0.0.1\bin\jps.exe" -l ^| findstr /I "roomroot-admin.jar"') do ( + echo Stopping existing backend PID %%p + taskkill /F /PID %%p >nul 2>&1 +) + +echo Starting backend JAR in background, independent of IDEA... +powershell -NoProfile -WindowStyle Hidden -Command "Start-Process -FilePath '%JAVA_EXE%' -ArgumentList '%JAVA_OPTS% -jar \"%JAR%\"' -WorkingDirectory 'D:\IDE-WorkSpace\New-JW\backend\roomroot-admin\target' -RedirectStandardOutput '%LOGDIR%\backend.out.log' -RedirectStandardError '%LOGDIR%\backend.err.log' -WindowStyle Hidden" +echo Backend started. Logs: %LOGDIR%\backend.out.log +endlocal diff --git a/deploy/start-nginx.bat b/deploy/start-nginx.bat new file mode 100644 index 00000000..f481b27b --- /dev/null +++ b/deploy/start-nginx.bat @@ -0,0 +1,22 @@ +@echo off +setlocal +set NGINX_HOME=D:\nginx +set CONF=%~dp0nginx.conf + +cd /d "%NGINX_HOME%" +nginx -p "%NGINX_HOME%/" -c "%CONF%" -t +if errorlevel 1 ( + echo Nginx config test failed. + pause + exit /b 1 +) + +tasklist /FI "IMAGENAME eq nginx.exe" | find /I "nginx.exe" >nul +if errorlevel 1 ( + start "" "%NGINX_HOME%\nginx.exe" -p "%NGINX_HOME%/" -c "%CONF%" + echo Nginx started on port 80. +) else ( + "%NGINX_HOME%\nginx.exe" -p "%NGINX_HOME%/" -c "%CONF%" -s reload + echo Nginx reloaded. +) +endlocal diff --git a/deploy/stop-nginx.bat b/deploy/stop-nginx.bat new file mode 100644 index 00000000..f94241ff --- /dev/null +++ b/deploy/stop-nginx.bat @@ -0,0 +1,4 @@ +@echo off +cd /d D:\nginx +nginx -s stop +echo Nginx stopped. diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 00000000..7034f9bf --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,22 @@ +# 告诉EditorConfig插件,这是根文件,不用继续往上查找 +root = true + +# 匹配全部文件 +[*] +# 设置字符集 +charset = utf-8 +# 缩进风格,可选space、tab +indent_style = space +# 缩进的空格数 +indent_size = 2 +# 结尾换行符,可选lf、cr、crlf +end_of_line = lf +# 在文件结尾插入新行 +insert_final_newline = true +# 删除一行中的前后空格 +trim_trailing_whitespace = true + +# 匹配md结尾的文件 +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/frontend/.env.development b/frontend/.env.development new file mode 100644 index 00000000..fb464bb0 --- /dev/null +++ b/frontend/.env.development @@ -0,0 +1,11 @@ +# 页面标题 +VUE_APP_TITLE = 教学管理信息系统 + +# 开发环境配置 +ENV = 'development' + +# 智慧教学管理系统/开发环境 +VUE_APP_BASE_API = '/api' + +# 路由懒加载 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/frontend/.env.production b/frontend/.env.production new file mode 100644 index 00000000..7c56c11b --- /dev/null +++ b/frontend/.env.production @@ -0,0 +1,8 @@ +# 页面标题 +VUE_APP_TITLE = 教学管理信息系统 + +# 生产环境配置 +ENV = 'production' + +# 智慧教学管理系统/生产环境 +VUE_APP_BASE_API = '/prod-api' diff --git a/frontend/.env.staging b/frontend/.env.staging new file mode 100644 index 00000000..4ee3bc13 --- /dev/null +++ b/frontend/.env.staging @@ -0,0 +1,12 @@ +# 页面标题 +VUE_APP_TITLE = 教学管理信息系统 + +BABEL_ENV = production + +NODE_ENV = production + +# 测试环境配置 +ENV = 'staging' + +# 智慧教学管理系统/测试环境 +VUE_APP_BASE_API = '/stage-api' diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..78a752d8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 00000000..00c0ab84 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,30 @@ +## 开发 + +```bash +# 克隆项目 +git clone https://gitee.com/y_project/RuoYi-Vue + +# 进入项目目录 +cd ruoyi-ui + +# 安装依赖 +npm install + +# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npmmirror.com + +# 启动服务 +npm run dev +``` + +浏览器访问 http://localhost:80 + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` \ No newline at end of file diff --git a/frontend/babel.config.js b/frontend/babel.config.js new file mode 100644 index 00000000..5aa05ebb --- /dev/null +++ b/frontend/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + 'plugins': ['dynamic-import-node'] + } + } +} \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..791d5fb7 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,71 @@ +{ + "name": "roomroot", + "version": "3.9.2", + "description": "教学管理信息系统", + "author": "教务", + "license": "MIT", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview" + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "repository": { + "type": "git", + "url": "https://gitee.com/y_project/roomroot-Vue.git" + }, + "dependencies": { + "@riophae/vue-treeselect": "0.4.0", + "axios": "0.30.3", + "clipboard": "2.0.8", + "core-js": "3.37.1", + "echarts": "5.4.0", + "element-ui": "2.15.14", + "file-saver": "2.0.5", + "fuse.js": "6.4.3", + "highlight.js": "9.18.5", + "js-beautify": "1.13.0", + "js-cookie": "3.0.1", + "jsencrypt": "3.0.0-rc.1", + "nprogress": "0.2.0", + "quill": "2.0.2", + "screenfull": "5.0.2", + "sortablejs": "1.10.2", + "vue": "2.6.12", + "vue-count-to": "1.0.13", + "vue-cropper": "0.5.5", + "vue-router": "3.4.9", + "vuedraggable": "2.24.3", + "vuex": "3.6.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.6", + "@vue/cli-service": "4.4.6", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "4.1.0", + "compression-webpack-plugin": "6.1.2", + "connect": "3.6.6", + "sass": "1.32.13", + "sass-loader": "10.1.1", + "script-ext-html-webpack-plugin": "2.1.5", + "svg-sprite-loader": "5.1.1", + "vue-template-compiler": "2.6.12" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 00000000..ea4750d0 Binary files /dev/null and b/frontend/public/favicon.ico differ diff --git a/frontend/public/html/ie.html b/frontend/public/html/ie.html new file mode 100644 index 00000000..b6634d12 --- /dev/null +++ b/frontend/public/html/ie.html @@ -0,0 +1,46 @@ + + + + + + 请升级您的浏览器 + + + + + + +

请升级您的浏览器,以便我们更好的为您提供服务!

+

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

+
+

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

+

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明

+
+

您可以选择更先进的浏览器

+

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

+ +
+ + \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html new file mode 100644 index 00000000..709bfe0e --- /dev/null +++ b/frontend/public/index.html @@ -0,0 +1,208 @@ + + + + + + + + + <%= webpackConfig.name %> + + + + +
+
+
+
+
+
正在加载系统资源,请耐心等待
+
+
+ + diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 00000000..f870a67b --- /dev/null +++ b/frontend/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/frontend/public/styles/theme-chalk/index.css b/frontend/public/styles/theme-chalk/index.css new file mode 100644 index 00000000..6a6ac1da --- /dev/null +++ b/frontend/public/styles/theme-chalk/index.css @@ -0,0 +1 @@ +@charset "UTF-8";[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#C0C4CC;background-color:#FFF;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #FFF;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#C0C4CC;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .arrow.disabled{visibility:hidden}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-dialog,.el-pager li{-webkit-box-sizing:border-box}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#C0C4CC}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#FFF}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;background:#FFF;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#C0C4CC}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;background:#FFF;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #E4E7ED;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#FFF}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#F5F7FA}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#FFF}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:not(.is-disabled)::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing){outline-width:0}.el-dropdown [disabled]{cursor:not-allowed;color:#bbb}.el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item,.el-menu-item{font-size:14px;padding:0 20px;cursor:pointer}.el-dropdown-menu__item{list-style:none;line-height:36px;margin:0;color:#606266;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#FFF}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#FFF}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-breadcrumb__item:last-child .el-breadcrumb__separator,.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--collapse .el-submenu,.el-menu-item{position:relative}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#FFF;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;list-style:none}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-submenu{min-width:200px}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #E4E7ED;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{color:#303133;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-radio-button__inner,.el-submenu__title{-webkit-box-sizing:border-box;position:relative;white-space:nowrap}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-picker-panel,.el-popover,.el-select-dropdown,.el-table-filter,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #DCDFE6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#DCDFE6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-input__prefix,.el-input__suffix{-webkit-transition:all .3s;color:#C0C4CC}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#FFF}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #E4E7ED;border-radius:4px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item{padding-right:40px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#FFF}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#F5F7FA}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#C0C4CC}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#C0C4CC;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#C0C4CC;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#E4E7ED}.el-range-editor.is-active,.el-range-editor.is-active:hover,.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#C0C4CC;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select__tags-text{overflow:hidden;text-overflow:ellipsis}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-select .el-tag__close.el-icon-close{background-color:#C0C4CC;top:0;color:#FFF;-ms-flex-negative:0;flex-shrink:0}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#FFF}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;font-size:12px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th.el-table__cell{background:#F5F7FA}.el-table .el-table__cell{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table--medium .el-table__cell{padding:10px 0}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:8px 0}.el-table--mini{font-size:12px}.el-table--mini .el-table__cell{padding:6px 0}.el-table tr{background-color:#FFF}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:1px solid #EBEEF5}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#FFF}.el-table th.el-table__cell>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th.el-table__cell>.cell.highlight{color:#409EFF}.el-table th.el-table__cell.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td,.el-table .cell,.el-table-filter{-webkit-box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table .cell{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-left:10px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #EBEEF5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#EBEEF5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border .el-table__cell,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #EBEEF5}.el-table--border .el-table__cell:first-child .cell{padding-left:10px}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:1px solid #EBEEF5;border-bottom-width:1px}.el-table--border th.el-table__cell,.el-table__fixed-right-patch{border-bottom:1px solid #EBEEF5}.el-table--hidden{visibility:hidden}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#EBEEF5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#FFF}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td.el-table__cell{border-top:1px solid #EBEEF5;background-color:#F5F7FA;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td.el-table__cell{border-top:1px solid #EBEEF5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td.el-table__cell,.el-table__header-wrapper tbody td.el-table__cell{background-color:#F5F7FA;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #EBEEF5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#C0C4CC;top:5px}.el-table .sort-caret.descending{border-top-color:#C0C4CC;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell,.el-table--striped .el-table__body tr.el-table__row--striped.selection-row td.el-table__cell{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.selection-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row.selection-row>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:#F5F7FA}.el-table__body tr.current-row>td.el-table__cell,.el-table__body tr.selection-row>td.el-table__cell{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #EBEEF5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td.el-table__cell{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:#F5F7FA}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #EBEEF5;border-radius:2px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-sizing:border-box;margin:2px 0}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#FFF}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #EBEEF5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#F2F6FC}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#C0C4CC}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#FFF}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#FFF;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#FFF}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#F5F7FA;opacity:1;cursor:not-allowed;color:#C0C4CC}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#F2F6FC;border-radius:15px}.el-date-table td.selected div:hover{background-color:#F2F6FC}.el-date-table td.selected span{background-color:#409EFF;color:#FFF;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #EBEEF5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409EFF;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#FFF}.el-month-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-month-table td.disabled .cell:hover{color:#C0C4CC}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409EFF}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#F2F6FC}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#FFF}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#FFF;background-color:#409EFF}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409EFF;font-weight:700}.el-year-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-year-table td.disabled .cell:hover{color:#C0C4CC}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#FFF}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #EBEEF5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#E4E7ED;cursor:not-allowed}.time-select-item:hover{background-color:#F5F7FA;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#C0C4CC;float:left;line-height:32px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input:-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::placeholder{color:#C0C4CC}.el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#C0C4CC;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#E4E7ED}.el-range-editor.is-disabled input{background-color:#F5F7FA;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::placeholder{color:#C0C4CC}.el-range-editor.is-disabled .el-range-separator{color:#C0C4CC}.el-picker-panel{color:#606266;border:1px solid #E4E7ED;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#FFF;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#FFF;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#FFF;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#FFF;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#F5F7FA;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#C0C4CC;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #E4E7ED;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #E4E7ED;border-bottom:1px solid #E4E7ED}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #E4E7ED}.el-popover{position:absolute;background:#FFF;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover,.el-cascader__dropdown,.el-color-picker__panel,.el-message-box,.el-notification{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#FFF;border-radius:4px;border:1px solid #EBEEF5;font-size:18px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#F56C6C}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67C23A}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#E6A23C}.el-message-box__status.el-icon-error{color:#F56C6C}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#F56C6C;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#E4E7ED;z-index:1}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409EFF inset;box-shadow:0 0 2px 2px #409EFF inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs--card>.el-tabs__header .el-tabs__active-bar,.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs__item .el-icon-close:hover{background-color:#C0C4CC;color:#FFF}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#C0C4CC;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #E4E7ED}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #E4E7ED;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #E4E7ED;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#FFF}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.el-tabs--border-card{background:#FFF;border:1px solid #DCDFE6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#F5F7FA;border-bottom:1px solid #E4E7ED;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-col-offset-0,.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#FFF;border-right-color:#DCDFE6;border-left-color:#DCDFE6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#C0C4CC}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-cascader-menu:last-child .el-cascader-node,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #DCDFE6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-button-group>.el-button:not(:last-child),.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #E4E7ED;border-bottom:none;border-top:1px solid #E4E7ED;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #E4E7ED;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #E4E7ED;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #E4E7ED;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #E4E7ED}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #E4E7ED;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #E4E7ED;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #E4E7ED;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#FFF;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#F5F7FA}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content:hover,.el-upload-list__item:hover{background-color:#F5F7FA}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#C0C4CC;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#C0C4CC}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#FFF;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active,.el-upload iframe{opacity:0}.el-carousel__arrow--right,.el-notification.right{right:16px}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #EBEEF5;position:fixed;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#F5F7FA;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #DCDFE6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #DCDFE6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#E4E7ED;color:#E4E7ED}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#E4E7ED;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #DCDFE6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #DCDFE6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing){outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-button-group::after,.el-button-group::before,.el-color-dropdown__main-wrapper::after,.el-link.is-underline:hover:after,.el-page-header__left::after,.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-transfer-panel .el-transfer-panel__footer::after,.el-upload-cover::after,.el-upload-list--picture-card .el-upload-list__item-actions::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#FFF}.el-tooltip__popper.is-light{background:#FFF;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#FFF}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#FFF}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#FFF}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#FFF}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{display:inline-block;vertical-align:middle}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#E4E7ED;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button{border-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-moz-user-select:none;-ms-user-select:none}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#FFF;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#FFF;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #DCDFE6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#C0C4CC}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-12,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row,.el-upload-dragger,.el-upload-list__item{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-col-0{width:0%}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;cursor:pointer;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;cursor:pointer;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#C0C4CC;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #DCDFE6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67C23A}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#FFF}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#FFF;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#FFF;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#FFF;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-badge__content,.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__header,.el-message,.el-step__icon{-webkit-box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#FFF;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{border-radius:10px;color:#FFF;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #FFF}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C}.el-card{border-radius:4px;border:1px solid #EBEEF5;background-color:#FFF;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;box-sizing:border-box}.el-card__body,.el-main{padding:20px}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#F5F7FA}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#C0C4CC;border-color:#C0C4CC}.el-step__head.is-success{color:#67C23A;border-color:#67C23A}.el-step__head.is-error{color:#F56C6C;border-color:#F56C6C}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;box-sizing:border-box;background:#FFF;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step.is-horizontal,.el-step__icon-inner{display:inline-block}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{-webkit-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#C0C4CC}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#C0C4CC}.el-step__title.is-success{color:#67C23A}.el-step__title.is-error{color:#F56C6C}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#C0C4CC}.el-step__description.is-success{color:#67C23A}.el-step__description.is-error{color:#F56C6C}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#C0C4CC}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#FFF;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#FFF;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;position:absolute;top:0;left:0}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-fade-in-enter,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #EBEEF5;border-bottom:1px solid #EBEEF5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#FFF;color:#303133;cursor:pointer;border-bottom:1px solid #EBEEF5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#FFF;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #EBEEF5}.el-cascader__search-input,.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-cascader,.el-tag{display:inline-block}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409EFF;border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409EFF}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67C23A}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:#409eff;border-color:#409eff;color:#fff}.el-tag--dark.is-hit{border-color:#409EFF}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#FFF;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67C23A}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409EFF}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67C23A}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#C0C4CC}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#C0C4CC}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#FFF;border:1px solid #E4E7ED;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#C0C4CC;color:#FFF}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#F5F7FA}.el-cascader__suggestion-item.is-checked{color:#409EFF;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#C0C4CC}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#C0C4CC}.el-cascader__search-input:-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::placeholder{color:#C0C4CC}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__icon,.el-input,.el-textarea{display:inline-block;width:100%}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty{font-size:12px;color:#999;position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#FFF;text-align:center;font-size:12px}.el-input__prefix,.el-input__suffix{position:absolute;top:0;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-input__inner,.el-textarea__inner,.el-transfer-panel{-webkit-box-sizing:border-box}.el-textarea{position:relative;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;background-image:none;border:1px solid #DCDFE6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;background-image:none;border-radius:4px;border:1px solid #DCDFE6;box-sizing:border-box;color:#606266;display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{height:100%;right:5px;transition:all .3s;pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{height:100%;left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-image-viewer__btn,.el-image__preview,.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#FFF;background-color:#409EFF;font-size:0}.el-button-group>.el-button+.el-button,.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-divider__text,.el-image__error,.el-link,.el-timeline,.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #DCDFE6;background-color:#F5F7FA;color:#C0C4CC}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer-panel{border:1px solid #EBEEF5;border-radius:4px;overflow:hidden;background:#FFF;display:inline-block;vertical-align:middle;width:200px;max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#F5F7FA;margin:0;padding-left:15px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-container,.el-header{-webkit-box-sizing:border-box}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#FFF;margin:0;padding:0;border-top:1px solid #EBEEF5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #E4E7ED}.el-timeline-item__icon{color:#FFF;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#E4E7ED;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409EFF}.el-timeline-item__node--success{background-color:#67C23A}.el-timeline-item__node--warning{background-color:#E6A23C}.el-timeline-item__node--danger{background-color:#F56C6C}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0;font-weight:500}.el-link.is-underline:hover:after{position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409EFF}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409EFF}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409EFF}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#409EFF}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;font-weight:500;color:#303133}.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#C0C4CC;vertical-align:middle}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;user-select:none}.el-button,.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff;top:50%}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button,.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{font-size:12px;border-radius:3px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:rgba(255,255,255,.5)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:not(.is-disabled):active,.el-button-group>.el-button:not(.is-disabled):focus,.el-button-group>.el-button:not(.is-disabled):hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #EBEEF5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#C0C4CC}.el-backtop,.el-calendar-table td.is-today{color:#409EFF}.el-calendar-table td{border-bottom:1px solid #EBEEF5;border-right:1px solid #EBEEF5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#F2F8FE}.el-calendar-table tr:first-child td{border-top:1px solid #EBEEF5}.el-calendar-table tr td:first-child{border-left:1px solid #EBEEF5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#F2F8FE}.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#EBEEF5;cursor:not-allowed}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#DCDFE6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#C0C4CC}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#C0C4CC}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#C0C4CC;border-color:#C0C4CC}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#C0C4CC;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#FFF;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #DCDFE6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#FFF;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409EFF}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #FFF;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#EBEEF5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-avatar,.el-cascader-panel,.el-radio,.el-radio--medium.is-bordered .el-radio__label,.el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;line-height:1;cursor:pointer;white-space:nowrap;outline:0;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-cascader-menu,.el-cascader-menu__list,.el-radio__inner{-webkit-box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;box-sizing:border-box}.el-radio__inner:hover{border-color:#409EFF}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#FFF;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px}.el-cascader-panel.is-bordered{border:1px solid #E4E7ED;border-radius:4px}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:#606266;border-right:solid 1px #E4E7ED}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#C0C4CC}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409EFF;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#F5F7FA}.el-cascader-node.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px}.el-drawer,.el-drawer__body>*{-webkit-box-sizing:border-box}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#FFF;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);overflow:hidden;outline:0}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer__container{position:relative;left:0;right:0;top:0;bottom:0;height:100%;width:100%}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-statistic{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;color:#000;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum";text-align:center}.el-statistic .head{margin-bottom:4px;color:#606266;font-size:13px}.el-statistic .con{font-family:Sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#303133}.el-statistic .con .number{font-size:20px;padding:0 4px}.el-statistic .con span{display:inline-block;margin:0;line-height:100%}.el-popconfirm__main,.el-skeleton__image{display:-ms-flexbox;-webkit-box-align:center;display:-webkit-box}.el-popconfirm__main{display:flex;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:flex;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#DCDDE0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#DCDDE0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#FFF}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered .el-descriptions-item__cell{border:1px solid #EBEEF5;padding:12px 10px}.el-descriptions :not(.is-bordered) .el-descriptions-item__cell{padding-bottom:12px}.el-descriptions--medium.is-bordered .el-descriptions-item__cell{padding:10px}.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:10px}.el-descriptions--small.is-bordered .el-descriptions-item__cell{padding:8px 10px}.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:8px}.el-descriptions--mini.is-bordered .el-descriptions-item__cell{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:6px}.el-descriptions-item{vertical-align:top}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__container .el-descriptions-item__content,.el-descriptions-item__container .el-descriptions-item__label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-descriptions-item__container .el-descriptions-item__content{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-descriptions-item__label.has-colon::after{content:':';position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-descriptions-item__content{word-break:break-word;overflow-wrap:break-word}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px }.el-result .icon-success{fill:#67C23A}.el-result .icon-error{fill:#F56C6C}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#E6A23C} \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 00000000..7eabf6e8 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,20 @@ + + + + diff --git a/frontend/src/api/login.js b/frontend/src/api/login.js new file mode 100644 index 00000000..0405b25f --- /dev/null +++ b/frontend/src/api/login.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid + } + return request({ + url: '/login', + headers: { + isToken: false, + repeatSubmit: false + }, + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 解锁屏幕 +export function unlockScreen(password) { + return request({ + url: '/unlockscreen', + method: 'post', + data: { password } + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + diff --git a/frontend/src/api/menu.js b/frontend/src/api/menu.js new file mode 100644 index 00000000..ee291359 --- /dev/null +++ b/frontend/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取路由 +export const getRouters = () => { + return request({ + url: '/getRouters', + method: 'get' + }) +} \ No newline at end of file diff --git a/frontend/src/api/monitor/cache.js b/frontend/src/api/monitor/cache.js new file mode 100644 index 00000000..257805c7 --- /dev/null +++ b/frontend/src/api/monitor/cache.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询缓存详细 +export function getCache() { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 查询缓存名称列表 +export function listCacheName() { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 查询缓存键名列表 +export function listCacheKey(cacheName) { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 查询缓存内容 +export function getCacheValue(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 清理指定名称缓存 +export function clearCacheName(cacheName) { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 清理指定键名缓存 +export function clearCacheKey(cacheKey) { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheKey, + method: 'delete' + }) +} + +// 清理全部缓存 +export function clearCacheAll() { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/frontend/src/api/monitor/job.js b/frontend/src/api/monitor/job.js new file mode 100644 index 00000000..82ff2fb5 --- /dev/null +++ b/frontend/src/api/monitor/job.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 查询定时任务调度列表 +export function listJob(query) { + return request({ + url: '/monitor/job/list', + method: 'get', + params: query + }) +} + +// 查询定时任务调度详细 +export function getJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'get' + }) +} + +// 新增定时任务调度 +export function addJob(data) { + return request({ + url: '/monitor/job', + method: 'post', + data: data + }) +} + +// 修改定时任务调度 +export function updateJob(data) { + return request({ + url: '/monitor/job', + method: 'put', + data: data + }) +} + +// 删除定时任务调度 +export function delJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'delete' + }) +} + +// 任务状态修改 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status + } + return request({ + url: '/monitor/job/changeStatus', + method: 'put', + data: data + }) +} + + +// 定时任务立即执行一次 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup + } + return request({ + url: '/monitor/job/run', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/frontend/src/api/monitor/jobLog.js b/frontend/src/api/monitor/jobLog.js new file mode 100644 index 00000000..b05fed45 --- /dev/null +++ b/frontend/src/api/monitor/jobLog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询调度日志列表 +export function listJobLog(query) { + return request({ + url: '/monitor/jobLog/list', + method: 'get', + params: query + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} diff --git a/frontend/src/api/monitor/logininfor.js b/frontend/src/api/monitor/logininfor.js new file mode 100644 index 00000000..e2193196 --- /dev/null +++ b/frontend/src/api/monitor/logininfor.js @@ -0,0 +1,43 @@ +import request from '@/utils/request' + +// 查询登录日志列表 +export function list(query) { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 查询首页登录日志列表 +export function homeList(query) { + return request({ + url: '/monitor/logininfor/homeList', + method: 'get', + params: query + }) +} + +// 删除登录日志 +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: '/monitor/logininfor/unlock/' + userName, + method: 'get' + }) +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/frontend/src/api/monitor/online.js b/frontend/src/api/monitor/online.js new file mode 100644 index 00000000..27fd9619 --- /dev/null +++ b/frontend/src/api/monitor/online.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询在线用户列表 +export function list(query) { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId) { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/frontend/src/api/monitor/operlog.js b/frontend/src/api/monitor/operlog.js new file mode 100644 index 00000000..fd86768a --- /dev/null +++ b/frontend/src/api/monitor/operlog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询操作日志列表 +export function list(query) { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 删除操作日志 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空操作日志 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/frontend/src/api/monitor/server.js b/frontend/src/api/monitor/server.js new file mode 100644 index 00000000..09290169 --- /dev/null +++ b/frontend/src/api/monitor/server.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取服务信息 +export function getServer() { + return request({ + url: '/monitor/server', + method: 'get' + }) +} \ No newline at end of file diff --git a/frontend/src/api/system/config.js b/frontend/src/api/system/config.js new file mode 100644 index 00000000..957b89c2 --- /dev/null +++ b/frontend/src/api/system/config.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function listConfig(query) { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 查询参数详细 +export function getConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey) { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 新增参数配置 +export function addConfig(data) { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 修改参数配置 +export function updateConfig(data) { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 删除参数配置 +export function delConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 刷新参数缓存 +export function refreshCache() { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/frontend/src/api/system/dept.js b/frontend/src/api/system/dept.js new file mode 100644 index 00000000..af67f82b --- /dev/null +++ b/frontend/src/api/system/dept.js @@ -0,0 +1,61 @@ +import request from '@/utils/request' + +// 查询部门列表 +export function listDept(query) { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId) { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 查询部门详细 +export function getDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 新增部门 +export function addDept(data) { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 修改部门 +export function updateDept(data) { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 保存部门排序 +export function updateDeptSort(data) { + return request({ + url: '/system/dept/updateSort', + method: 'put', + data: data + }) +} + +// 删除部门 +export function delDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/frontend/src/api/system/dict/data.js b/frontend/src/api/system/dict/data.js new file mode 100644 index 00000000..50ec3c28 --- /dev/null +++ b/frontend/src/api/system/dict/data.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询字典数据列表 +export function listData(query) { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 查询字典数据详细 +export function getData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType) { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 新增字典数据 +export function addData(data) { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 修改字典数据 +export function updateData(data) { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 删除字典数据 +export function delData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/frontend/src/api/system/dict/type.js b/frontend/src/api/system/dict/type.js new file mode 100644 index 00000000..19ec1193 --- /dev/null +++ b/frontend/src/api/system/dict/type.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询字典类型列表 +export function listType(query) { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 查询字典类型详细 +export function getType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 新增字典类型 +export function addType(data) { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 修改字典类型 +export function updateType(data) { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 删除字典类型 +export function delType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 刷新字典缓存 +export function refreshCache() { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 获取字典选择框列表 +export function optionselect() { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} \ No newline at end of file diff --git a/frontend/src/api/system/menu.js b/frontend/src/api/system/menu.js new file mode 100644 index 00000000..24b58dd2 --- /dev/null +++ b/frontend/src/api/system/menu.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' + +// 查询菜单列表 +export function listMenu(query) { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 查询菜单详细 +export function getMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 查询菜单下拉树结构 +export function treeselect() { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId) { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 新增菜单 +export function addMenu(data) { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 修改菜单 +export function updateMenu(data) { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 保存菜单排序 +export function updateMenuSort(data) { + return request({ + url: '/system/menu/updateSort', + method: 'put', + data: data + }) +} + +// 删除菜单 +export function delMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/frontend/src/api/system/notice.js b/frontend/src/api/system/notice.js new file mode 100644 index 00000000..c240e071 --- /dev/null +++ b/frontend/src/api/system/notice.js @@ -0,0 +1,79 @@ +import request from '@/utils/request' + +// 查询公告列表 +export function listNotice(query) { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 查询公告详细 +export function getNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 新增公告 +export function addNotice(data) { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 修改公告 +export function updateNotice(data) { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 删除公告 +export function delNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} + +// 首页顶部公告列表(带已读状态) +export function listNoticeTop() { + return request({ + url: '/system/notice/listTop', + method: 'get' + }) +} + +// 标记公告已读 +export function markNoticeRead(noticeId) { + return request({ + url: '/system/notice/markRead', + method: 'post', + params: { noticeId } + }) +} + +// 批量标记已读 +export function markNoticeReadAll(ids) { + return request({ + url: '/system/notice/markReadAll', + method: 'post', + params: { ids } + }) +} + +// 查询公告已读用户列表 +export function listNoticeReadUsers(query) { + return request({ + url: '/system/notice/readUsers/list', + method: 'get', + params: query + }) +} diff --git a/frontend/src/api/system/post.js b/frontend/src/api/system/post.js new file mode 100644 index 00000000..6b491f7b --- /dev/null +++ b/frontend/src/api/system/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/frontend/src/api/system/role.js b/frontend/src/api/system/role.js new file mode 100644 index 00000000..816fb7ea --- /dev/null +++ b/frontend/src/api/system/role.js @@ -0,0 +1,119 @@ +import request from '@/utils/request' + +// 查询角色列表 +export function listRole(query) { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 新增角色 +export function addRole(data) { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/frontend/src/api/system/user.js b/frontend/src/api/system/user.js new file mode 100644 index 00000000..61258141 --- /dev/null +++ b/frontend/src/api/system/user.js @@ -0,0 +1,136 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/roomroot" + +// 查询用户列表 +export function listUser(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 查询用户详细 +export function getUser(userId) { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 新增用户 +export function addUser(data) { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 删除用户 +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 用户密码重置 +export function resetUserPwd(userId, password) { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 用户状态修改 +export function changeUserStatus(userId, status) { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + data: data + }) +} + +// 用户头像上传 +export function uploadAvatar(data) { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: data + }) +} + +// 查询授权角色 +export function getAuthRole(userId) { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 保存授权角色 +export function updateAuthRole(data) { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/frontend/src/api/teachBusiness/semester.js b/frontend/src/api/teachBusiness/semester.js new file mode 100644 index 00000000..79f4cb87 --- /dev/null +++ b/frontend/src/api/teachBusiness/semester.js @@ -0,0 +1,46 @@ +import request from '@/utils/request' + +// 分页查询学期列表 +export function listSemester(query) { + return request({ + url: '/semester/list', + method: 'get', + params: query + }) +} + +// 根据主键查询学期 +export function getSemester(nd) { + return request({ + url: '/semester/get', + method: 'get', + params: { nd: nd } + }) +} + +// 学期新增 +export function addSemester(data) { + return request({ + url: '/semester/add', + method: 'post', + data: data + }) +} + +// 根据主键修改 +export function updateSemester(data) { + return request({ + url: '/semester/update', + method: 'post', + data: data + }) +} + +// 根据主键删除 +export function delSemester(nd) { + return request({ + url: '/semester/delete', + method: 'post', + params: { nd: nd } + }) +} diff --git a/frontend/src/api/teachBusiness/xqxlb.js b/frontend/src/api/teachBusiness/xqxlb.js new file mode 100644 index 00000000..5a273114 --- /dev/null +++ b/frontend/src/api/teachBusiness/xqxlb.js @@ -0,0 +1,28 @@ +import request from '@/utils/request' + +// 按学期查询校历假期列表(nd 为学期代号,如 202601) +export function listXqxlb(query) { + return request({ + url: '/xqxlb/list', + method: 'get', + params: query + }) +} + +// 根据主键查询校历假期 +export function getXqxlb(bh) { + return request({ + url: '/xqxlb/get', + method: 'get', + params: { bh: bh } + }) +} + +// 新增 / 修改校历假期(无 bh 时为新增,带 bh 时为修改) +export function updateXqxlb(data) { + return request({ + url: '/xqxlb/update', + method: 'post', + data: data + }) +} diff --git a/frontend/src/api/teachNotice.js b/frontend/src/api/teachNotice.js new file mode 100644 index 00000000..ff5c4800 --- /dev/null +++ b/frontend/src/api/teachNotice.js @@ -0,0 +1,47 @@ +import request from '@/utils/request' + +// 分页查询教学公告列表 +export function listTeachNotice(query) { + return request({ + url: '/notice-announcement/list', + method: 'get', + params: query + }) +} + +// 查询公告详情 +export function getTeachNotice(Id) { + return request({ + url: '/notice-announcement/get', + method: 'get', + params: { Id } + }) +} + +// 新增公告 +export function addTeachNotice(data) { + return request({ + url: '/notice-announcement/add', + method: 'post', + data: data + }) +} + +// 修改公告(含下架/上架:更新时附带 status) +export function updateTeachNotice(data) { + return request({ + url: '/notice-announcement/update', + method: 'post', + params: { Id: data.id }, + data: data + }) +} + +// 删除/下架(级联删除:先删通告用户信息表,再删通告表) +export function delTeachNotice(Id) { + return request({ + url: '/notice-announcement/delete', + method: 'post', + params: { Id } + }) +} \ No newline at end of file diff --git a/frontend/src/api/teachOffice/office.js b/frontend/src/api/teachOffice/office.js new file mode 100644 index 00000000..7161b685 --- /dev/null +++ b/frontend/src/api/teachOffice/office.js @@ -0,0 +1,37 @@ +import request from '@/utils/request' + +// 查询教研室列表 +export function listOffice(query) { + return request({ + url: '/jys/office/list', + method: 'get', + params: query + }) +} + +// 新增教研室 +export function addOffice(data) { + return request({ + url: '/jys/office/add', + method: 'post', + data: data + }) +} + +// 更新教研室 +export function updateOffice(data) { + return request({ + url: '/jys/office/update', + method: 'post', + data: data + }) +} + +// 停用教研室(jysdh 必传,query 参数) +export function disableOffice(jysdh) { + return request({ + url: '/jys/office/disable', + method: 'post', + params: { jysdh: jysdh } + }) +} diff --git a/frontend/src/api/tool/gen.js b/frontend/src/api/tool/gen.js new file mode 100644 index 00000000..65757ac7 --- /dev/null +++ b/frontend/src/api/tool/gen.js @@ -0,0 +1,86 @@ +import request from '@/utils/request' + +// 查询生成表数据 +export function listTable(query) { + return request({ + url: '/tool/gen/list', + method: 'get', + params: query + }) +} + +// 查询db数据库列表 +export function listDbTable(query) { + return request({ + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 修改代码生成信息 +export function updateGenTable(data) { + return request({ + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 导入表 +export function importTable(data) { + return request({ + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 创建表 +export function createTable(data) { + return request({ + url: '/tool/gen/createTable', + method: 'post', + params: data + }) +} + +// 预览生成代码 +export function previewTable(tableId) { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 删除表数据 +export function delTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 生成代码(自定义路径) +export function genCode(tableName) { + return request({ + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 同步数据库 +export function synchDb(tableName) { + return request({ + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} diff --git a/frontend/src/assets/401_images/401.gif b/frontend/src/assets/401_images/401.gif new file mode 100644 index 00000000..cd6e0d94 Binary files /dev/null and b/frontend/src/assets/401_images/401.gif differ diff --git a/frontend/src/assets/404_images/404.png b/frontend/src/assets/404_images/404.png new file mode 100644 index 00000000..3d8e2305 Binary files /dev/null and b/frontend/src/assets/404_images/404.png differ diff --git a/frontend/src/assets/404_images/404_cloud.png b/frontend/src/assets/404_images/404_cloud.png new file mode 100644 index 00000000..c6281d09 Binary files /dev/null and b/frontend/src/assets/404_images/404_cloud.png differ diff --git a/frontend/src/assets/icons/index.js b/frontend/src/assets/icons/index.js new file mode 100644 index 00000000..e1a28d7f --- /dev/null +++ b/frontend/src/assets/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/frontend/src/assets/icons/svg/404.svg b/frontend/src/assets/icons/svg/404.svg new file mode 100644 index 00000000..6df50190 --- /dev/null +++ b/frontend/src/assets/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/bell.svg b/frontend/src/assets/icons/svg/bell.svg new file mode 100644 index 00000000..a7320a05 --- /dev/null +++ b/frontend/src/assets/icons/svg/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/bug.svg b/frontend/src/assets/icons/svg/bug.svg new file mode 100644 index 00000000..05a150dc --- /dev/null +++ b/frontend/src/assets/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/build.svg b/frontend/src/assets/icons/svg/build.svg new file mode 100644 index 00000000..97c46886 --- /dev/null +++ b/frontend/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/button.svg b/frontend/src/assets/icons/svg/button.svg new file mode 100644 index 00000000..904fddc8 --- /dev/null +++ b/frontend/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/cascader.svg b/frontend/src/assets/icons/svg/cascader.svg new file mode 100644 index 00000000..e256024f --- /dev/null +++ b/frontend/src/assets/icons/svg/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/chart.svg b/frontend/src/assets/icons/svg/chart.svg new file mode 100644 index 00000000..27728fb0 --- /dev/null +++ b/frontend/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/checkbox.svg b/frontend/src/assets/icons/svg/checkbox.svg new file mode 100644 index 00000000..013fd3a2 --- /dev/null +++ b/frontend/src/assets/icons/svg/checkbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/clipboard.svg b/frontend/src/assets/icons/svg/clipboard.svg new file mode 100644 index 00000000..90923ff6 --- /dev/null +++ b/frontend/src/assets/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/code.svg b/frontend/src/assets/icons/svg/code.svg new file mode 100644 index 00000000..5f9c5abd --- /dev/null +++ b/frontend/src/assets/icons/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/color.svg b/frontend/src/assets/icons/svg/color.svg new file mode 100644 index 00000000..44a81aab --- /dev/null +++ b/frontend/src/assets/icons/svg/color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/component.svg b/frontend/src/assets/icons/svg/component.svg new file mode 100644 index 00000000..29c34580 --- /dev/null +++ b/frontend/src/assets/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/dashboard.svg b/frontend/src/assets/icons/svg/dashboard.svg new file mode 100644 index 00000000..5317d370 --- /dev/null +++ b/frontend/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/date-range.svg b/frontend/src/assets/icons/svg/date-range.svg new file mode 100644 index 00000000..fda571e7 --- /dev/null +++ b/frontend/src/assets/icons/svg/date-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/date.svg b/frontend/src/assets/icons/svg/date.svg new file mode 100644 index 00000000..52dc73ee --- /dev/null +++ b/frontend/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/dict.svg b/frontend/src/assets/icons/svg/dict.svg new file mode 100644 index 00000000..48493773 --- /dev/null +++ b/frontend/src/assets/icons/svg/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/documentation.svg b/frontend/src/assets/icons/svg/documentation.svg new file mode 100644 index 00000000..70431228 --- /dev/null +++ b/frontend/src/assets/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/download.svg b/frontend/src/assets/icons/svg/download.svg new file mode 100644 index 00000000..c8969513 --- /dev/null +++ b/frontend/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/drag.svg b/frontend/src/assets/icons/svg/drag.svg new file mode 100644 index 00000000..4185d3ce --- /dev/null +++ b/frontend/src/assets/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/druid.svg b/frontend/src/assets/icons/svg/druid.svg new file mode 100644 index 00000000..a2b4b4ed --- /dev/null +++ b/frontend/src/assets/icons/svg/druid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/edit.svg b/frontend/src/assets/icons/svg/edit.svg new file mode 100644 index 00000000..d26101f2 --- /dev/null +++ b/frontend/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/education.svg b/frontend/src/assets/icons/svg/education.svg new file mode 100644 index 00000000..7bfb01d1 --- /dev/null +++ b/frontend/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/email.svg b/frontend/src/assets/icons/svg/email.svg new file mode 100644 index 00000000..74d25e21 --- /dev/null +++ b/frontend/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/enter.svg b/frontend/src/assets/icons/svg/enter.svg new file mode 100644 index 00000000..f7cabf29 --- /dev/null +++ b/frontend/src/assets/icons/svg/enter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/example.svg b/frontend/src/assets/icons/svg/example.svg new file mode 100644 index 00000000..46f42b53 --- /dev/null +++ b/frontend/src/assets/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/excel.svg b/frontend/src/assets/icons/svg/excel.svg new file mode 100644 index 00000000..74d97b80 --- /dev/null +++ b/frontend/src/assets/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/exit-fullscreen.svg b/frontend/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 00000000..485c128b --- /dev/null +++ b/frontend/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/eye-open.svg b/frontend/src/assets/icons/svg/eye-open.svg new file mode 100644 index 00000000..88dcc98e --- /dev/null +++ b/frontend/src/assets/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/eye.svg b/frontend/src/assets/icons/svg/eye.svg new file mode 100644 index 00000000..16ed2d87 --- /dev/null +++ b/frontend/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/form.svg b/frontend/src/assets/icons/svg/form.svg new file mode 100644 index 00000000..dcbaa185 --- /dev/null +++ b/frontend/src/assets/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/fullscreen.svg b/frontend/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 00000000..0e86b6fa --- /dev/null +++ b/frontend/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/github.svg b/frontend/src/assets/icons/svg/github.svg new file mode 100644 index 00000000..db0a0d43 --- /dev/null +++ b/frontend/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/guide.svg b/frontend/src/assets/icons/svg/guide.svg new file mode 100644 index 00000000..b2710017 --- /dev/null +++ b/frontend/src/assets/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/icon.svg b/frontend/src/assets/icons/svg/icon.svg new file mode 100644 index 00000000..82be8eee --- /dev/null +++ b/frontend/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/input.svg b/frontend/src/assets/icons/svg/input.svg new file mode 100644 index 00000000..ab91381e --- /dev/null +++ b/frontend/src/assets/icons/svg/input.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/international.svg b/frontend/src/assets/icons/svg/international.svg new file mode 100644 index 00000000..e9b56eee --- /dev/null +++ b/frontend/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/job.svg b/frontend/src/assets/icons/svg/job.svg new file mode 100644 index 00000000..2a93a251 --- /dev/null +++ b/frontend/src/assets/icons/svg/job.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/language.svg b/frontend/src/assets/icons/svg/language.svg new file mode 100644 index 00000000..0082b577 --- /dev/null +++ b/frontend/src/assets/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/link.svg b/frontend/src/assets/icons/svg/link.svg new file mode 100644 index 00000000..48197ba4 --- /dev/null +++ b/frontend/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/list.svg b/frontend/src/assets/icons/svg/list.svg new file mode 100644 index 00000000..20259edd --- /dev/null +++ b/frontend/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/lock.svg b/frontend/src/assets/icons/svg/lock.svg new file mode 100644 index 00000000..74fee543 --- /dev/null +++ b/frontend/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/log.svg b/frontend/src/assets/icons/svg/log.svg new file mode 100644 index 00000000..d879d33b --- /dev/null +++ b/frontend/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/logininfor.svg b/frontend/src/assets/icons/svg/logininfor.svg new file mode 100644 index 00000000..267f8447 --- /dev/null +++ b/frontend/src/assets/icons/svg/logininfor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/message.svg b/frontend/src/assets/icons/svg/message.svg new file mode 100644 index 00000000..14ca8172 --- /dev/null +++ b/frontend/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/money.svg b/frontend/src/assets/icons/svg/money.svg new file mode 100644 index 00000000..c1580de1 --- /dev/null +++ b/frontend/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/monitor.svg b/frontend/src/assets/icons/svg/monitor.svg new file mode 100644 index 00000000..bc308cb0 --- /dev/null +++ b/frontend/src/assets/icons/svg/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/more-up.svg b/frontend/src/assets/icons/svg/more-up.svg new file mode 100644 index 00000000..d30ac11c --- /dev/null +++ b/frontend/src/assets/icons/svg/more-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/nested.svg b/frontend/src/assets/icons/svg/nested.svg new file mode 100644 index 00000000..06713a86 --- /dev/null +++ b/frontend/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/number.svg b/frontend/src/assets/icons/svg/number.svg new file mode 100644 index 00000000..ad5ce9af --- /dev/null +++ b/frontend/src/assets/icons/svg/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/online.svg b/frontend/src/assets/icons/svg/online.svg new file mode 100644 index 00000000..330a2029 --- /dev/null +++ b/frontend/src/assets/icons/svg/online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/password.svg b/frontend/src/assets/icons/svg/password.svg new file mode 100644 index 00000000..6c64defe --- /dev/null +++ b/frontend/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/pdf.svg b/frontend/src/assets/icons/svg/pdf.svg new file mode 100644 index 00000000..957aa0cc --- /dev/null +++ b/frontend/src/assets/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/people.svg b/frontend/src/assets/icons/svg/people.svg new file mode 100644 index 00000000..2bd54aeb --- /dev/null +++ b/frontend/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/peoples.svg b/frontend/src/assets/icons/svg/peoples.svg new file mode 100644 index 00000000..aab852e5 --- /dev/null +++ b/frontend/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/phone.svg b/frontend/src/assets/icons/svg/phone.svg new file mode 100644 index 00000000..ab8e8c4e --- /dev/null +++ b/frontend/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/post.svg b/frontend/src/assets/icons/svg/post.svg new file mode 100644 index 00000000..2922c613 --- /dev/null +++ b/frontend/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/qq.svg b/frontend/src/assets/icons/svg/qq.svg new file mode 100644 index 00000000..ee13d4ec --- /dev/null +++ b/frontend/src/assets/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/question.svg b/frontend/src/assets/icons/svg/question.svg new file mode 100644 index 00000000..cf75bd4b --- /dev/null +++ b/frontend/src/assets/icons/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/radio.svg b/frontend/src/assets/icons/svg/radio.svg new file mode 100644 index 00000000..0cde3452 --- /dev/null +++ b/frontend/src/assets/icons/svg/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/rate.svg b/frontend/src/assets/icons/svg/rate.svg new file mode 100644 index 00000000..aa3b14d7 --- /dev/null +++ b/frontend/src/assets/icons/svg/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/redis-list.svg b/frontend/src/assets/icons/svg/redis-list.svg new file mode 100644 index 00000000..98a15b2a --- /dev/null +++ b/frontend/src/assets/icons/svg/redis-list.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/redis.svg b/frontend/src/assets/icons/svg/redis.svg new file mode 100644 index 00000000..2f1d62df --- /dev/null +++ b/frontend/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/row.svg b/frontend/src/assets/icons/svg/row.svg new file mode 100644 index 00000000..07809922 --- /dev/null +++ b/frontend/src/assets/icons/svg/row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/search.svg b/frontend/src/assets/icons/svg/search.svg new file mode 100644 index 00000000..84233dda --- /dev/null +++ b/frontend/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/select.svg b/frontend/src/assets/icons/svg/select.svg new file mode 100644 index 00000000..d6283828 --- /dev/null +++ b/frontend/src/assets/icons/svg/select.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/server.svg b/frontend/src/assets/icons/svg/server.svg new file mode 100644 index 00000000..eb287e36 --- /dev/null +++ b/frontend/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/shopping.svg b/frontend/src/assets/icons/svg/shopping.svg new file mode 100644 index 00000000..87513e7c --- /dev/null +++ b/frontend/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/size.svg b/frontend/src/assets/icons/svg/size.svg new file mode 100644 index 00000000..ddb25b8d --- /dev/null +++ b/frontend/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/skill.svg b/frontend/src/assets/icons/svg/skill.svg new file mode 100644 index 00000000..a3b73121 --- /dev/null +++ b/frontend/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/slider.svg b/frontend/src/assets/icons/svg/slider.svg new file mode 100644 index 00000000..fbe4f39f --- /dev/null +++ b/frontend/src/assets/icons/svg/slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/star.svg b/frontend/src/assets/icons/svg/star.svg new file mode 100644 index 00000000..6cf86e66 --- /dev/null +++ b/frontend/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/swagger.svg b/frontend/src/assets/icons/svg/swagger.svg new file mode 100644 index 00000000..05d4e7bc --- /dev/null +++ b/frontend/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/switch.svg b/frontend/src/assets/icons/svg/switch.svg new file mode 100644 index 00000000..0ba61e38 --- /dev/null +++ b/frontend/src/assets/icons/svg/switch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/system.svg b/frontend/src/assets/icons/svg/system.svg new file mode 100644 index 00000000..5992593e --- /dev/null +++ b/frontend/src/assets/icons/svg/system.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/tab.svg b/frontend/src/assets/icons/svg/tab.svg new file mode 100644 index 00000000..b4b48e48 --- /dev/null +++ b/frontend/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/table.svg b/frontend/src/assets/icons/svg/table.svg new file mode 100644 index 00000000..0e3dc9de --- /dev/null +++ b/frontend/src/assets/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/textarea.svg b/frontend/src/assets/icons/svg/textarea.svg new file mode 100644 index 00000000..2709f292 --- /dev/null +++ b/frontend/src/assets/icons/svg/textarea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/theme.svg b/frontend/src/assets/icons/svg/theme.svg new file mode 100644 index 00000000..5982a2f7 --- /dev/null +++ b/frontend/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/time-range.svg b/frontend/src/assets/icons/svg/time-range.svg new file mode 100644 index 00000000..13c1202b --- /dev/null +++ b/frontend/src/assets/icons/svg/time-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/time.svg b/frontend/src/assets/icons/svg/time.svg new file mode 100644 index 00000000..b376e32a --- /dev/null +++ b/frontend/src/assets/icons/svg/time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/tool.svg b/frontend/src/assets/icons/svg/tool.svg new file mode 100644 index 00000000..48e0e357 --- /dev/null +++ b/frontend/src/assets/icons/svg/tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/tree-table.svg b/frontend/src/assets/icons/svg/tree-table.svg new file mode 100644 index 00000000..8aafdb82 --- /dev/null +++ b/frontend/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/tree.svg b/frontend/src/assets/icons/svg/tree.svg new file mode 100644 index 00000000..dd4b7dd2 --- /dev/null +++ b/frontend/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/upload.svg b/frontend/src/assets/icons/svg/upload.svg new file mode 100644 index 00000000..bae49c0a --- /dev/null +++ b/frontend/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/user.svg b/frontend/src/assets/icons/svg/user.svg new file mode 100644 index 00000000..0ba0716a --- /dev/null +++ b/frontend/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/validCode.svg b/frontend/src/assets/icons/svg/validCode.svg new file mode 100644 index 00000000..cfb10214 --- /dev/null +++ b/frontend/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/wechat.svg b/frontend/src/assets/icons/svg/wechat.svg new file mode 100644 index 00000000..c586e551 --- /dev/null +++ b/frontend/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svg/zip.svg b/frontend/src/assets/icons/svg/zip.svg new file mode 100644 index 00000000..f806fc48 --- /dev/null +++ b/frontend/src/assets/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/svgo.yml b/frontend/src/assets/icons/svgo.yml new file mode 100644 index 00000000..d11906ae --- /dev/null +++ b/frontend/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/frontend/src/assets/images/dark.svg b/frontend/src/assets/images/dark.svg new file mode 100644 index 00000000..f646bd7e --- /dev/null +++ b/frontend/src/assets/images/dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/images/light.svg b/frontend/src/assets/images/light.svg new file mode 100644 index 00000000..ab7cc088 --- /dev/null +++ b/frontend/src/assets/images/light.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/images/login-background.jpg b/frontend/src/assets/images/login-background.jpg new file mode 100644 index 00000000..8a89eb82 Binary files /dev/null and b/frontend/src/assets/images/login-background.jpg differ diff --git a/frontend/src/assets/images/pay.png b/frontend/src/assets/images/pay.png new file mode 100644 index 00000000..bb8b9672 Binary files /dev/null and b/frontend/src/assets/images/pay.png differ diff --git a/frontend/src/assets/images/profile.jpg b/frontend/src/assets/images/profile.jpg new file mode 100644 index 00000000..b3a940b2 Binary files /dev/null and b/frontend/src/assets/images/profile.jpg differ diff --git a/frontend/src/assets/logo/logo.png b/frontend/src/assets/logo/logo.png new file mode 100644 index 00000000..e2637602 Binary files /dev/null and b/frontend/src/assets/logo/logo.png differ diff --git a/frontend/src/assets/styles/btn.scss b/frontend/src/assets/styles/btn.scss new file mode 100644 index 00000000..f2db674e --- /dev/null +++ b/frontend/src/assets/styles/btn.scss @@ -0,0 +1,145 @@ +@import './variables.scss'; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue) +} + +.light-blue-btn { + @include colorBtn($light-blue) +} + +.red-btn { + @include colorBtn($red) +} + +.pink-btn { + @include colorBtn($pink) +} + +.green-btn { + @include colorBtn($green) +} + +.tiffany-btn { + @include colorBtn($tiffany) +} + +.yellow-btn { + @include colorBtn($yellow) +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} + +// ================= 教学任务模块操作按钮(灰 / 主色 / 蓝色) ================= +.gray-btn, +.primary-btn, +.blue-btn { + display: inline-block; + height: 30px; + line-height: 1; + padding: 0 15px; + font-size: 13px; + border-radius: 4px; + border: 1px solid transparent; + cursor: pointer; + vertical-align: middle; + white-space: nowrap; + transition: all 0.2s; +} + +.gray-btn { + background: #f5f7fa; + color: #333; + border-color: #dcdfe6; + + &:hover { + background: #e4e7ed; + } +} + +.primary-btn { + background: #00875a; + color: #fff; + + &:hover { + background: #006b47; + } +} + +.blue-btn { + background: #3a71a8; + color: #fff; + + &:hover { + background: #2f5e8c; + color: #fff; + } +} diff --git a/frontend/src/assets/styles/element-ui.scss b/frontend/src/assets/styles/element-ui.scss new file mode 100644 index 00000000..8e2301bf --- /dev/null +++ b/frontend/src/assets/styles/element-ui.scss @@ -0,0 +1,92 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0px; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0px; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} + +.el-menu--collapse + > div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} \ No newline at end of file diff --git a/frontend/src/assets/styles/element-variables.scss b/frontend/src/assets/styles/element-variables.scss new file mode 100644 index 00000000..21a8f3e0 --- /dev/null +++ b/frontend/src/assets/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #00875A; +$--color-success: #13ce66; +$--color-warning: #ffba00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border: 1px solid #dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/frontend/src/assets/styles/index.scss b/frontend/src/assets/styles/index.scss new file mode 100644 index 00000000..c5090295 --- /dev/null +++ b/frontend/src/assets/styles/index.scss @@ -0,0 +1,193 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; +@import './btn.scss'; + +/* ================= 系统主题色(教育绿) ================= */ +:root { + /* 基础绿 */ + --edu-green: #007F4F; + --edu-green-hover: #00663E; + --edu-green-bg: #E3F2E9; + + /* 主色:导航、按钮、主题色 */ + --edu-green-primary: #00875A; /* rgb(0,135,90) */ + /* hover 加深 */ + --edu-green-dark: #006B47; /* rgb(0,107,71) */ + /* 浅色背景、标签底色 */ + --edu-green-light: #E6F4EA; /* rgb(230,244,234) */ +} + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: var(--edu-green-primary); + cursor: pointer; + + &:hover { + color: var(--edu-green-dark); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, var(--edu-green-primary) 0%, var(--edu-green-primary) 0%, var(--edu-green-dark) 100%, var(--edu-green-dark) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: var(--edu-green-primary); + cursor: pointer; + + &:hover { + color: var(--edu-green-dark); + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} diff --git a/frontend/src/assets/styles/mixin.scss b/frontend/src/assets/styles/mixin.scss new file mode 100644 index 00000000..a9f3bc7c --- /dev/null +++ b/frontend/src/assets/styles/mixin.scss @@ -0,0 +1,7 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} diff --git a/frontend/src/assets/styles/roomroot.scss b/frontend/src/assets/styles/roomroot.scss new file mode 100644 index 00000000..bfc3a0c8 --- /dev/null +++ b/frontend/src/assets/styles/roomroot.scss @@ -0,0 +1,484 @@ +/** +* 通用css样式布局处理 +* Copyright (c) 2019 roomroot +*/ + +/** 基础通用 **/ +.pt5 { + padding-top: 5px; +} + +.pr5 { + padding-right: 5px; +} + +.pb5 { + padding-bottom: 5px; +} + +.mt5 { + margin-top: 5px; +} + +.mr5 { + margin-right: 5px; +} + +.mb5 { + margin-bottom: 5px; +} + +.mb8 { + margin-bottom: 8px; +} + +.ml5 { + margin-left: 5px; +} + +.mt10 { + margin-top: 10px; +} + +.mr10 { + margin-right: 10px; +} + +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mr20 { + margin-right: 20px; +} + +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-message-box__status + .el-message-box__message{ + word-break: break-word; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog__body { + padding: 8px 20px !important; +} + +.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px +} + +/** 表格布局 **/ +.pagination-container { + display: flex; + justify-content: flex-end; + margin-top: 20px; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #FFFFFF none; + border-radius: 4px; +} + +/* horizontal el menu */ +.el-menu--horizontal .el-menu-item .svg-icon + span, +.el-menu--horizontal .el-submenu__title .svg-icon + span { + margin-left: 3px; +} + +.el-menu--horizontal .el-menu--popup { + min-width: 120px !important; +} + +@media (max-width: 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--mini { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { + cursor: pointer; + margin-left: 5px; +} + +.el-table .el-dropdown, .el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px; +} + +.card-box { + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/** 详细卡片样式 */ +.detail-drawer { + .el-drawer__header { + margin-bottom: 6px; + padding: 8px 12px 6px; + font-size: 15px; + color: #303133; + background: #f8f8f8; + } + .section-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 12px 0 16px 0; + padding-bottom: 8px; + } + .drawer-content { + padding: 0 20px 20px 20px; + .info-item { + display: flex; + align-items: flex-start; + padding: 8px 0; + min-height: 40px; + } + .info-label { + flex-shrink: 0; + width: 200px; + color: #606266; + font-size: 13px; + line-height: 1.6; + padding-top: 4px; + text-align: right; + margin-right: 14px; + } + .info-value { + flex: 1; + color: #303133; + font-size: 13px; + font-weight: 500; + line-height: 1.6; + word-break: break-all; + padding-top: 4px; + min-height: 1.6em; + &.plaintext { + border-bottom: 1px dashed #dde1e6; + } + } + } +} + +.detail-wrap { padding: 0 4px; } + +.detail-card { + border: 1px solid #ebeef5; + border-radius: 6px; + margin-bottom: 14px; + overflow: hidden; +} + +.detail-card-title { + background: #f7f9fb; + padding: 8px 16px; + font-size: 13px; + font-weight: 600; + color: #333; + border-bottom: 1px solid #ebeef5; +} +.detail-card-title i { margin-right: 5px; color: #00875A; } + +.detail-row { padding: 0 8px; } + +.detail-item { + display: flex; + align-items: flex-start; + padding: 10px 8px; + font-size: 13px; + border-bottom: 1px solid #f5f7fa; +} +.detail-item:last-child { border-bottom: none; } + +.detail-label { + flex-shrink: 0; + width: 72px; + color: #909399; + margin-right: 12px; +} +.detail-value { color: #303133; flex: 1; word-break: break-all; } +.detail-location { color: #999; font-size: 12px; } + +.method-tag { + display: inline-block; + padding: 1px 7px; + border-radius: 3px; + font-size: 11px; + font-weight: 700; + margin-right: 6px; + vertical-align: middle; +} +.mono { font-family: Consolas, 'SFMono-Regular', monospace; font-size: 12px; } +.code-body { padding: 14px; } +.code-wrap { + background: #f7f9fb; + border: 1px solid #e8ecf0; + border-radius: 4px; + overflow: hidden; + max-height: 260px; + position: relative; +} +.code-action { + position: absolute; + top: 8px; + right: 8px; + z-index: 10; + margin: 0; + padding: 0; +} +.code-action .el-button { + height: 24px; + font-size: 12px; + padding: 4px 8px; + background: rgba(255, 255, 255, 0.9); + border: 1px solid #dcdcdc; +} +.code-action .el-button:hover { + background: #ffffff; + border-color: #00875A; +} +.code-pre { + margin: 0; + padding: 12px 14px; + font-size: 12px; + line-height: 1.6; + font-family: Consolas, 'SFMono-Regular', monospace; + color: #444; + white-space: pre-wrap; + word-break: break-all; + overflow: auto; + max-height: 240px; + display: block; +} + +/* tree-sidebar content */ +.tree-sidebar-manage-wrap { + display: flex; + gap: 0; + min-height: calc(100vh - 130px); + padding: 0 !important; + overflow: hidden; +} + +.tree-sidebar-content { + flex: 1; + min-width: 0; + overflow: hidden; + background: #fff; + + .content-inner { + padding: 12px 16px; + height: 100%; + overflow-y: auto; + } +} + +/* error */ +.error-title { color: #c0392b !important; } +.error-title i { color: #c0392b !important; } +.error-body { padding: 12px 16px; } +.error-msg { + background: #fff8f8; + border-left: 3px solid #e74c3c; + border-radius: 3px; + padding: 8px 12px; + color: #c0392b; + font-size: 12px; + line-height: 1.7; + word-break: break-all; + white-space: pre-wrap; +} + +/* http method */ +.method-GET { background: #e8f5e9; color: #27ae60; } +.method-POST { background: #e3f2fd; color: #1565c0; } +.method-PUT { background: #fff3e0; color: #e65100; } +.method-DELETE { background: #ffebee; color: #c62828; } + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.allowDrag { cursor: grab; } +.allowDrag:active { cursor: grabbing; } + +.sortable-ghost { + opacity: .8; + color: #fff !important; + background: #42b983 !important; +} + +.top-right-btn { + position: relative; + float: right; +} diff --git a/frontend/src/assets/styles/ruoyi.scss b/frontend/src/assets/styles/ruoyi.scss new file mode 100644 index 00000000..bfc3a0c8 --- /dev/null +++ b/frontend/src/assets/styles/ruoyi.scss @@ -0,0 +1,484 @@ +/** +* 通用css样式布局处理 +* Copyright (c) 2019 roomroot +*/ + +/** 基础通用 **/ +.pt5 { + padding-top: 5px; +} + +.pr5 { + padding-right: 5px; +} + +.pb5 { + padding-bottom: 5px; +} + +.mt5 { + margin-top: 5px; +} + +.mr5 { + margin-right: 5px; +} + +.mb5 { + margin-bottom: 5px; +} + +.mb8 { + margin-bottom: 8px; +} + +.ml5 { + margin-left: 5px; +} + +.mt10 { + margin-top: 10px; +} + +.mr10 { + margin-right: 10px; +} + +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mr20 { + margin-right: 20px; +} + +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-message-box__status + .el-message-box__message{ + word-break: break-word; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog__body { + padding: 8px 20px !important; +} + +.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px +} + +/** 表格布局 **/ +.pagination-container { + display: flex; + justify-content: flex-end; + margin-top: 20px; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #FFFFFF none; + border-radius: 4px; +} + +/* horizontal el menu */ +.el-menu--horizontal .el-menu-item .svg-icon + span, +.el-menu--horizontal .el-submenu__title .svg-icon + span { + margin-left: 3px; +} + +.el-menu--horizontal .el-menu--popup { + min-width: 120px !important; +} + +@media (max-width: 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--mini { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { + cursor: pointer; + margin-left: 5px; +} + +.el-table .el-dropdown, .el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px; +} + +.card-box { + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/** 详细卡片样式 */ +.detail-drawer { + .el-drawer__header { + margin-bottom: 6px; + padding: 8px 12px 6px; + font-size: 15px; + color: #303133; + background: #f8f8f8; + } + .section-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 12px 0 16px 0; + padding-bottom: 8px; + } + .drawer-content { + padding: 0 20px 20px 20px; + .info-item { + display: flex; + align-items: flex-start; + padding: 8px 0; + min-height: 40px; + } + .info-label { + flex-shrink: 0; + width: 200px; + color: #606266; + font-size: 13px; + line-height: 1.6; + padding-top: 4px; + text-align: right; + margin-right: 14px; + } + .info-value { + flex: 1; + color: #303133; + font-size: 13px; + font-weight: 500; + line-height: 1.6; + word-break: break-all; + padding-top: 4px; + min-height: 1.6em; + &.plaintext { + border-bottom: 1px dashed #dde1e6; + } + } + } +} + +.detail-wrap { padding: 0 4px; } + +.detail-card { + border: 1px solid #ebeef5; + border-radius: 6px; + margin-bottom: 14px; + overflow: hidden; +} + +.detail-card-title { + background: #f7f9fb; + padding: 8px 16px; + font-size: 13px; + font-weight: 600; + color: #333; + border-bottom: 1px solid #ebeef5; +} +.detail-card-title i { margin-right: 5px; color: #00875A; } + +.detail-row { padding: 0 8px; } + +.detail-item { + display: flex; + align-items: flex-start; + padding: 10px 8px; + font-size: 13px; + border-bottom: 1px solid #f5f7fa; +} +.detail-item:last-child { border-bottom: none; } + +.detail-label { + flex-shrink: 0; + width: 72px; + color: #909399; + margin-right: 12px; +} +.detail-value { color: #303133; flex: 1; word-break: break-all; } +.detail-location { color: #999; font-size: 12px; } + +.method-tag { + display: inline-block; + padding: 1px 7px; + border-radius: 3px; + font-size: 11px; + font-weight: 700; + margin-right: 6px; + vertical-align: middle; +} +.mono { font-family: Consolas, 'SFMono-Regular', monospace; font-size: 12px; } +.code-body { padding: 14px; } +.code-wrap { + background: #f7f9fb; + border: 1px solid #e8ecf0; + border-radius: 4px; + overflow: hidden; + max-height: 260px; + position: relative; +} +.code-action { + position: absolute; + top: 8px; + right: 8px; + z-index: 10; + margin: 0; + padding: 0; +} +.code-action .el-button { + height: 24px; + font-size: 12px; + padding: 4px 8px; + background: rgba(255, 255, 255, 0.9); + border: 1px solid #dcdcdc; +} +.code-action .el-button:hover { + background: #ffffff; + border-color: #00875A; +} +.code-pre { + margin: 0; + padding: 12px 14px; + font-size: 12px; + line-height: 1.6; + font-family: Consolas, 'SFMono-Regular', monospace; + color: #444; + white-space: pre-wrap; + word-break: break-all; + overflow: auto; + max-height: 240px; + display: block; +} + +/* tree-sidebar content */ +.tree-sidebar-manage-wrap { + display: flex; + gap: 0; + min-height: calc(100vh - 130px); + padding: 0 !important; + overflow: hidden; +} + +.tree-sidebar-content { + flex: 1; + min-width: 0; + overflow: hidden; + background: #fff; + + .content-inner { + padding: 12px 16px; + height: 100%; + overflow-y: auto; + } +} + +/* error */ +.error-title { color: #c0392b !important; } +.error-title i { color: #c0392b !important; } +.error-body { padding: 12px 16px; } +.error-msg { + background: #fff8f8; + border-left: 3px solid #e74c3c; + border-radius: 3px; + padding: 8px 12px; + color: #c0392b; + font-size: 12px; + line-height: 1.7; + word-break: break-all; + white-space: pre-wrap; +} + +/* http method */ +.method-GET { background: #e8f5e9; color: #27ae60; } +.method-POST { background: #e3f2fd; color: #1565c0; } +.method-PUT { background: #fff3e0; color: #e65100; } +.method-DELETE { background: #ffebee; color: #c62828; } + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.allowDrag { cursor: grab; } +.allowDrag:active { cursor: grabbing; } + +.sortable-ghost { + opacity: .8; + color: #fff !important; + background: #42b983 !important; +} + +.top-right-btn { + position: relative; + float: right; +} diff --git a/frontend/src/assets/styles/sidebar.scss b/frontend/src/assets/styles/sidebar.scss new file mode 100644 index 00000000..5bbb3c8c --- /dev/null +++ b/frontend/src/assets/styles/sidebar.scss @@ -0,0 +1,324 @@ +#app { + + .sidebar-container { + -webkit-transition: width .28s; + transition: width 0.28s; + width: $base-sidebar-width !important; + background-color: $base-menu-background; + height: 100%; + position: relative; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 10px !important; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, .el-submenu__title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + height: 44px !important; + line-height: 44px !important; + font-weight: 600; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-submenu__title { + color: $base-menu-color-active !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-submenu>.el-submenu__title, + & .theme-dark .el-submenu .el-menu-item { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + + // theme-dark 深色主题(绿色导航栏) + &.theme-dark { + border-right: none; + + // Element 会内联设置子菜单 ul 和 item 的背景色,强制用深色子菜单背景 + .el-submenu .el-menu--inline { + background-color: $base-sub-menu-background !important; + } + + .el-submenu .el-menu-item, + .nest-menu .el-submenu > .el-submenu__title { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + + .el-menu-item.is-active { + position: relative; + font-weight: 600; + + &::before { + content: ''; + position: absolute; + inset: 0; + background-color: rgba(255, 255, 255, 0.15); + border-right: 3px solid #FFC53D; + pointer-events: none; + z-index: 1; + } + } + + .el-submenu.is-active > .el-submenu__title { + color: #E6F4EA !important; + font-weight: 600; + + &::before { + background-color: rgba(255, 255, 255, 0.15); + border-right: 3px solid #FFC53D; + } + + .el-submenu__icon-arrow { + color: #FFC53D !important; + } + } + + .el-submenu__title .el-submenu__icon-arrow { + color: rgba(255, 255, 255, 0.9); + font-size: 12px; + font-weight: 700; + transition: transform 0.2s; + } + + .el-menu-item:not(.is-active), + .submenu-title-noDropdown, + .el-submenu__title { + position: relative; + + &::before { + content: ''; + position: absolute; + inset: 0; + background-color: transparent; + pointer-events: none; + z-index: 1; + transition: background-color 0.2s; + } + + &:hover::before { + background-color: rgba(255, 255, 255, 0.1); + } + } + } + + // theme-light 浅色主题 + &.theme-light { + border-right: 1px solid #e8eaf0; + box-shadow: none; + + .el-menu-item, + .el-submenu__title { + color: rgba(0, 0, 0, 0.65); + } + + .el-menu-item.is-active { + color: var(--current-color, #00875A) !important; + position: relative; + + &::before { + content: ''; + position: absolute; + inset: 0; + background-color: var(--current-color-light, #E6F4EA); + border-right: 3px solid var(--current-color, #00875A); + pointer-events: none; + z-index: 1; + } + } + + .el-submenu.is-active > .el-submenu__title { + color: var(--current-color, #00875A) !important; + } + + .el-menu-item:not(.is-active):hover, + .submenu-title-noDropdown:hover, + .el-submenu__title:hover { + background-color: #f5f7fa !important; + color: rgba(0, 0, 0, 0.85) !important; + } + + .nest-menu .el-submenu > .el-submenu__title, + .el-submenu .el-menu-item { + background-color: #fafafa !important; + + &:hover { + background-color: #f0f5ff !important; + } + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .el-menu:not(.el-menu--horizontal) { + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .sidebar-container { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + transition: transform .28s; + width: $base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$base-sidebar-width, 0, 0); + } + } + } +} + +// when menu collapsed +.el-menu--vertical { + box-shadow: none; + + >.el-menu--popup { + box-shadow: none !important; + } + + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/frontend/src/assets/styles/transition.scss b/frontend/src/assets/styles/transition.scss new file mode 100644 index 00000000..a695208a --- /dev/null +++ b/frontend/src/assets/styles/transition.scss @@ -0,0 +1,49 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform--move, +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/frontend/src/assets/styles/variables.scss b/frontend/src/assets/styles/variables.scss new file mode 100644 index 00000000..962c5514 --- /dev/null +++ b/frontend/src/assets/styles/variables.scss @@ -0,0 +1,35 @@ +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// 默认菜单主题风格(教育绿) +$base-menu-color: #e8f5ef; +$base-menu-color-active: #ffffff; +$base-menu-background: #00875A; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; + +$base-sub-menu-background: #006B47; +$base-sub-menu-hover: rgba(255,255,255,.12); + +$base-sidebar-width: 200px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; +} diff --git a/frontend/src/components/Breadcrumb/index.vue b/frontend/src/components/Breadcrumb/index.vue new file mode 100644 index 00000000..7f9fc075 --- /dev/null +++ b/frontend/src/components/Breadcrumb/index.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/frontend/src/components/Crontab/day.vue b/frontend/src/components/Crontab/day.vue new file mode 100644 index 00000000..bd3a4207 --- /dev/null +++ b/frontend/src/components/Crontab/day.vue @@ -0,0 +1,161 @@ + + + diff --git a/frontend/src/components/Crontab/hour.vue b/frontend/src/components/Crontab/hour.vue new file mode 100644 index 00000000..5a606044 --- /dev/null +++ b/frontend/src/components/Crontab/hour.vue @@ -0,0 +1,120 @@ + + + diff --git a/frontend/src/components/Crontab/index.vue b/frontend/src/components/Crontab/index.vue new file mode 100644 index 00000000..f72c118d --- /dev/null +++ b/frontend/src/components/Crontab/index.vue @@ -0,0 +1,430 @@ + + + + diff --git a/frontend/src/components/Crontab/min.vue b/frontend/src/components/Crontab/min.vue new file mode 100644 index 00000000..ba4a3c51 --- /dev/null +++ b/frontend/src/components/Crontab/min.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/Crontab/month.vue b/frontend/src/components/Crontab/month.vue new file mode 100644 index 00000000..59ace617 --- /dev/null +++ b/frontend/src/components/Crontab/month.vue @@ -0,0 +1,114 @@ + + + diff --git a/frontend/src/components/Crontab/result.vue b/frontend/src/components/Crontab/result.vue new file mode 100644 index 00000000..6aba0133 --- /dev/null +++ b/frontend/src/components/Crontab/result.vue @@ -0,0 +1,558 @@ + + + diff --git a/frontend/src/components/Crontab/second.vue b/frontend/src/components/Crontab/second.vue new file mode 100644 index 00000000..9c104358 --- /dev/null +++ b/frontend/src/components/Crontab/second.vue @@ -0,0 +1,117 @@ + + + diff --git a/frontend/src/components/Crontab/week.vue b/frontend/src/components/Crontab/week.vue new file mode 100644 index 00000000..50cea485 --- /dev/null +++ b/frontend/src/components/Crontab/week.vue @@ -0,0 +1,202 @@ + + + diff --git a/frontend/src/components/Crontab/year.vue b/frontend/src/components/Crontab/year.vue new file mode 100644 index 00000000..f95eb893 --- /dev/null +++ b/frontend/src/components/Crontab/year.vue @@ -0,0 +1,131 @@ + + + diff --git a/frontend/src/components/DictData/index.js b/frontend/src/components/DictData/index.js new file mode 100644 index 00000000..e3199034 --- /dev/null +++ b/frontend/src/components/DictData/index.js @@ -0,0 +1,49 @@ +import Vue from 'vue' +import store from '@/store' +import DataDict from '@/utils/dict' +import { getDicts as getDicts } from '@/api/system/dict/data' + +function searchDictByKey(dict, key) { + if (key == null && key == "") { + return null + } + try { + for (let i = 0; i < dict.length; i++) { + if (dict[i].key == key) { + return dict[i].value + } + } + } catch (e) { + return null + } +} + +function install() { + Vue.use(DataDict, { + metas: { + '*': { + labelField: 'dictLabel', + valueField: 'dictValue', + request(dictMeta) { + const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) + if (storeDict) { + return new Promise(resolve => { resolve(storeDict) }) + } else { + return new Promise((resolve, reject) => { + getDicts(dictMeta.type).then(res => { + store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) + resolve(res.data) + }).catch(error => { + reject(error) + }) + }) + } + }, + }, + }, + }) +} + +export default { + install, +} \ No newline at end of file diff --git a/frontend/src/components/DictTag/index.vue b/frontend/src/components/DictTag/index.vue new file mode 100644 index 00000000..573714f5 --- /dev/null +++ b/frontend/src/components/DictTag/index.vue @@ -0,0 +1,93 @@ + + + + diff --git a/frontend/src/components/Editor/index.vue b/frontend/src/components/Editor/index.vue new file mode 100644 index 00000000..bb827c76 --- /dev/null +++ b/frontend/src/components/Editor/index.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/frontend/src/components/ExcelImportDialog/index.vue b/frontend/src/components/ExcelImportDialog/index.vue new file mode 100644 index 00000000..93504562 --- /dev/null +++ b/frontend/src/components/ExcelImportDialog/index.vue @@ -0,0 +1,126 @@ + + + diff --git a/frontend/src/components/FileUpload/index.vue b/frontend/src/components/FileUpload/index.vue new file mode 100644 index 00000000..84a08123 --- /dev/null +++ b/frontend/src/components/FileUpload/index.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/frontend/src/components/Hamburger/index.vue b/frontend/src/components/Hamburger/index.vue new file mode 100644 index 00000000..daf414e4 --- /dev/null +++ b/frontend/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/frontend/src/components/HeaderSearch/index.vue b/frontend/src/components/HeaderSearch/index.vue new file mode 100644 index 00000000..93f71eac --- /dev/null +++ b/frontend/src/components/HeaderSearch/index.vue @@ -0,0 +1,397 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/IconSelect/index.vue b/frontend/src/components/IconSelect/index.vue new file mode 100644 index 00000000..9ec4dbd3 --- /dev/null +++ b/frontend/src/components/IconSelect/index.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/frontend/src/components/IconSelect/requireIcons.js b/frontend/src/components/IconSelect/requireIcons.js new file mode 100644 index 00000000..075fec34 --- /dev/null +++ b/frontend/src/components/IconSelect/requireIcons.js @@ -0,0 +1,11 @@ + +const req = require.context('../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const icons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default icons diff --git a/frontend/src/components/ImagePreview/index.vue b/frontend/src/components/ImagePreview/index.vue new file mode 100644 index 00000000..9a08a63d --- /dev/null +++ b/frontend/src/components/ImagePreview/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/frontend/src/components/ImageUpload/index.vue b/frontend/src/components/ImageUpload/index.vue new file mode 100644 index 00000000..bd293431 --- /dev/null +++ b/frontend/src/components/ImageUpload/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/frontend/src/components/Pagination/index.vue b/frontend/src/components/Pagination/index.vue new file mode 100644 index 00000000..4b93b4bb --- /dev/null +++ b/frontend/src/components/Pagination/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/frontend/src/components/PanThumb/index.vue b/frontend/src/components/PanThumb/index.vue new file mode 100644 index 00000000..ccd287a8 --- /dev/null +++ b/frontend/src/components/PanThumb/index.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/frontend/src/components/ParentView/index.vue b/frontend/src/components/ParentView/index.vue new file mode 100644 index 00000000..0229f7c7 --- /dev/null +++ b/frontend/src/components/ParentView/index.vue @@ -0,0 +1,3 @@ + diff --git a/frontend/src/components/PlaceholderPage/index.vue b/frontend/src/components/PlaceholderPage/index.vue new file mode 100644 index 00000000..b668a784 --- /dev/null +++ b/frontend/src/components/PlaceholderPage/index.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/frontend/src/components/RightToolbar/index.vue b/frontend/src/components/RightToolbar/index.vue new file mode 100644 index 00000000..62459123 --- /dev/null +++ b/frontend/src/components/RightToolbar/index.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/frontend/src/components/Screenfull/index.vue b/frontend/src/components/Screenfull/index.vue new file mode 100644 index 00000000..c34357d5 --- /dev/null +++ b/frontend/src/components/Screenfull/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/frontend/src/components/SizeSelect/index.vue b/frontend/src/components/SizeSelect/index.vue new file mode 100644 index 00000000..540cf7c1 --- /dev/null +++ b/frontend/src/components/SizeSelect/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/frontend/src/components/SvgIcon/index.vue b/frontend/src/components/SvgIcon/index.vue new file mode 100644 index 00000000..f0850511 --- /dev/null +++ b/frontend/src/components/SvgIcon/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/frontend/src/components/ThemePicker/index.vue b/frontend/src/components/ThemePicker/index.vue new file mode 100644 index 00000000..536ba777 --- /dev/null +++ b/frontend/src/components/ThemePicker/index.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/frontend/src/components/TreePanel/index.vue b/frontend/src/components/TreePanel/index.vue new file mode 100644 index 00000000..d69f296f --- /dev/null +++ b/frontend/src/components/TreePanel/index.vue @@ -0,0 +1,709 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/iFrame/index.vue b/frontend/src/components/iFrame/index.vue new file mode 100644 index 00000000..9655dabf --- /dev/null +++ b/frontend/src/components/iFrame/index.vue @@ -0,0 +1,36 @@ + + + diff --git a/frontend/src/layout/components/Navbar.vue b/frontend/src/layout/components/Navbar.vue new file mode 100644 index 00000000..7a41720a --- /dev/null +++ b/frontend/src/layout/components/Navbar.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/frontend/src/layout/components/SemesterBar.vue b/frontend/src/layout/components/SemesterBar.vue new file mode 100644 index 00000000..d67e31dd --- /dev/null +++ b/frontend/src/layout/components/SemesterBar.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/frontend/src/layout/components/Settings/index.vue b/frontend/src/layout/components/Settings/index.vue new file mode 100644 index 00000000..e424854a --- /dev/null +++ b/frontend/src/layout/components/Settings/index.vue @@ -0,0 +1,430 @@ + + + + + diff --git a/frontend/src/layout/components/Sidebar/FixiOSBug.js b/frontend/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 00000000..e78ef2a5 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,25 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/frontend/src/layout/components/Sidebar/Item.vue b/frontend/src/layout/components/Sidebar/Item.vue new file mode 100644 index 00000000..952a4201 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,33 @@ + diff --git a/frontend/src/layout/components/Sidebar/Link.vue b/frontend/src/layout/components/Sidebar/Link.vue new file mode 100644 index 00000000..5fdf1d26 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend/src/layout/components/Sidebar/SidebarItem.vue b/frontend/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 00000000..0e87064c --- /dev/null +++ b/frontend/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,99 @@ + + + diff --git a/frontend/src/layout/components/Sidebar/index.vue b/frontend/src/layout/components/Sidebar/index.vue new file mode 100644 index 00000000..bea597b9 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/index.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/frontend/src/layout/components/TagsView/ScrollPane.vue b/frontend/src/layout/components/TagsView/ScrollPane.vue new file mode 100644 index 00000000..fd8d9365 --- /dev/null +++ b/frontend/src/layout/components/TagsView/ScrollPane.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/frontend/src/layout/components/TagsView/index.vue b/frontend/src/layout/components/TagsView/index.vue new file mode 100644 index 00000000..67b2842d --- /dev/null +++ b/frontend/src/layout/components/TagsView/index.vue @@ -0,0 +1,784 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/src/layout/components/TopNav/index.vue b/frontend/src/layout/components/TopNav/index.vue new file mode 100644 index 00000000..21d3cd5f --- /dev/null +++ b/frontend/src/layout/components/TopNav/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/frontend/src/layout/components/index.js b/frontend/src/layout/components/index.js new file mode 100644 index 00000000..dc3d0139 --- /dev/null +++ b/frontend/src/layout/components/index.js @@ -0,0 +1,5 @@ +export { default as AppMain } from './AppMain' +export { default as Navbar } from './Navbar' +export { default as Settings } from './Settings' +export { default as Sidebar } from './Sidebar/index.vue' +export { default as TagsView } from './TagsView/index.vue' diff --git a/frontend/src/layout/index.vue b/frontend/src/layout/index.vue new file mode 100644 index 00000000..c6c97255 --- /dev/null +++ b/frontend/src/layout/index.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/frontend/src/layout/mixin/ResizeHandler.js b/frontend/src/layout/mixin/ResizeHandler.js new file mode 100644 index 00000000..01580de0 --- /dev/null +++ b/frontend/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 00000000..da778b9c --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,74 @@ +import Vue from 'vue' + +import Cookies from 'js-cookie' + +import Element from 'element-ui' +import './assets/styles/element-variables.scss' + +import '@/assets/styles/index.scss' // global css +import '@/assets/styles/roomroot.scss' // roomroot css +import App from './App' +import store from './store' +import router from './router' +import directive from './directive' // directive +import plugins from './plugins' // plugins +import { download } from '@/utils/request' + +import './assets/icons' // icon +import './permission' // permission control +import { getDicts } from "@/api/system/dict/data" +import { getConfigKey } from "@/api/system/config" +import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/roomroot" +// 分页组件 +import Pagination from "@/components/Pagination" +// 自定义表格工具组件 +import RightToolbar from "@/components/RightToolbar" +// 富文本组件 +import Editor from "@/components/Editor" +// 文件上传组件 +import FileUpload from "@/components/FileUpload" +// 图片上传组件 +import ImageUpload from "@/components/ImageUpload" +// 图片预览组件 +import ImagePreview from "@/components/ImagePreview" +// 字典标签组件 +import DictTag from '@/components/DictTag' +// 字典数据组件 +import DictData from '@/components/DictData' + +// 全局方法挂载 +Vue.prototype.getDicts = getDicts +Vue.prototype.getConfigKey = getConfigKey +Vue.prototype.parseTime = parseTime +Vue.prototype.resetForm = resetForm +Vue.prototype.addDateRange = addDateRange +Vue.prototype.selectDictLabel = selectDictLabel +Vue.prototype.selectDictLabels = selectDictLabels +Vue.prototype.download = download +Vue.prototype.handleTree = handleTree + +// 全局组件挂载 +Vue.component('DictTag', DictTag) +Vue.component('Pagination', Pagination) +Vue.component('RightToolbar', RightToolbar) +Vue.component('Editor', Editor) +Vue.component('FileUpload', FileUpload) +Vue.component('ImageUpload', ImageUpload) +Vue.component('ImagePreview', ImagePreview) + +Vue.use(directive) +Vue.use(plugins) +DictData.install() + +Vue.use(Element, { + size: Cookies.get('size') || 'medium' // set element-ui default size +}) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/frontend/src/permission.js b/frontend/src/permission.js new file mode 100644 index 00000000..d23e8a1a --- /dev/null +++ b/frontend/src/permission.js @@ -0,0 +1,70 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' +import { isPathMatch } from '@/utils/validate' +import { isRelogin } from '@/utils/request' + +NProgress.configure({ showSpinner: false }) + +const whiteList = ['/login', '/register'] + +const isWhiteList = (path) => { + return whiteList.some(pattern => isPathMatch(pattern, path)) +} + +router.beforeEach((to, from, next) => { + NProgress.start() + if (getToken()) { + to.meta.title && store.dispatch('settings/setTitle', to.meta.title) + const isLock = store.getters.isLock + /* has token*/ + if (to.path === '/login') { + next({ path: '/' }) + NProgress.done() + } else if (isWhiteList(to.path)) { + next() + } else if (isLock && to.path !== '/lock') { + next({ path: '/lock' }) + NProgress.done() + } else if (!isLock && to.path === '/lock') { + next({ path: '/' }) + NProgress.done() + } else { + if (store.getters.roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + store.dispatch('GetInfo').then(() => { + isRelogin.show = false + store.dispatch('GenerateRoutes').then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + router.addRoutes(accessRoutes) // 动态添加可访问路由表 + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch(err => { + store.dispatch('LogOut').then(() => { + Message.error(err) + next({ path: '/' }) + }) + }) + } else { + next() + } + } + } else { + // 没有token + if (isWhiteList(to.path)) { + // 在免登录白名单,直接进入 + next() + } else { + next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页 + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/frontend/src/plugins/auth.js b/frontend/src/plugins/auth.js new file mode 100644 index 00000000..eabe9b0d --- /dev/null +++ b/frontend/src/plugins/auth.js @@ -0,0 +1,60 @@ +import store from '@/store' + +function authPermission(permission) { + const all_permission = "*:*:*" + const permissions = store.getters && store.getters.permissions + if (permission && permission.length > 0) { + return permissions.some(v => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role) { + const super_admin = "admin" + const roles = store.getters && store.getters.roles + if (role && role.length > 0) { + return roles.some(v => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission) + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role) + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/frontend/src/plugins/cache.js b/frontend/src/plugins/cache.js new file mode 100644 index 00000000..23e7cb94 --- /dev/null +++ b/frontend/src/plugins/cache.js @@ -0,0 +1,79 @@ +const sessionCache = { + set (key, value) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key) { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key) { + sessionStorage.removeItem(key) + } +} +const localCache = { + set (key, value) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key) { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key) { + localStorage.removeItem(key) + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/frontend/src/plugins/download.js b/frontend/src/plugins/download.js new file mode 100644 index 00000000..c528a241 --- /dev/null +++ b/frontend/src/plugins/download.js @@ -0,0 +1,79 @@ +import axios from 'axios' +import {Loading, Message} from 'element-ui' +import { saveAs } from 'file-saver' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { blobValidate } from "@/utils/roomroot" + +const baseURL = process.env.VUE_APP_BASE_API +let downloadLoadingInstance + +export default { + name(name, isDelete = true) { + var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + resource(resource) { + var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + zip(url, name) { + var url = baseURL + url + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/zip' }) + this.saveAs(blob, name) + } else { + this.printErrMsg(res.data) + } + downloadLoadingInstance.close() + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) + }, + saveAs(text, name, opts) { + saveAs(text, name, opts) + }, + async printErrMsg(data) { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg) + } +} + diff --git a/frontend/src/plugins/index.js b/frontend/src/plugins/index.js new file mode 100644 index 00000000..7182bb0a --- /dev/null +++ b/frontend/src/plugins/index.js @@ -0,0 +1,20 @@ +import tab from './tab' +import auth from './auth' +import cache from './cache' +import modal from './modal' +import download from './download' + +export default { + install(Vue) { + // 页签操作 + Vue.prototype.$tab = tab + // 认证对象 + Vue.prototype.$auth = auth + // 缓存对象 + Vue.prototype.$cache = cache + // 模态框对象 + Vue.prototype.$modal = modal + // 下载文件 + Vue.prototype.$download = download + } +} diff --git a/frontend/src/plugins/modal.js b/frontend/src/plugins/modal.js new file mode 100644 index 00000000..bd4cd026 --- /dev/null +++ b/frontend/src/plugins/modal.js @@ -0,0 +1,83 @@ +import { Message, MessageBox, Notification, Loading } from 'element-ui' + +let loadingInstance + +export default { + // 消息提示 + msg(content) { + Message.info(content) + }, + // 错误消息 + msgError(content) { + Message.error(content) + }, + // 成功消息 + msgSuccess(content) { + Message.success(content) + }, + // 警告消息 + msgWarning(content) { + Message.warning(content) + }, + // 弹出提示 + alert(content) { + MessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content) { + MessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content) { + MessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content) { + MessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content) { + Notification.info(content) + }, + // 错误通知 + notifyError(content) { + Notification.error(content) + }, + // 成功通知 + notifySuccess(content) { + Notification.success(content) + }, + // 警告通知 + notifyWarning(content) { + Notification.warning(content) + }, + // 确认窗体 + confirm(content) { + return MessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content) { + return MessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content) { + loadingInstance = Loading.service({ + lock: true, + text: content, + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close() + } +} diff --git a/frontend/src/plugins/tab.js b/frontend/src/plugins/tab.js new file mode 100644 index 00000000..f83ac08a --- /dev/null +++ b/frontend/src/plugins/tab.js @@ -0,0 +1,75 @@ +import store from '@/store' +import router from '@/router' + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + const { path, query, matched } = router.currentRoute + // 防止在重定向过程中重复刷新 + if (path.startsWith('/redirect/')) { + return Promise.resolve() + } + if (obj === undefined) { + matched.forEach((m) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query } + } + } + }) + } + return store.dispatch('tagsView/delCachedView', obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + store.dispatch("tagsView/delView", router.currentRoute) + if (obj !== undefined) { + return router.push(obj) + } + }, + // 关闭指定tab页签 + closePage(obj) { + if (obj === undefined) { + return store.dispatch('tagsView/delView', router.currentRoute).then(({ visitedViews }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/') + }) + } + return store.dispatch('tagsView/delView', obj) + }, + // 关闭所有tab页签 + closeAllPage() { + return store.dispatch('tagsView/delAllViews') + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute) + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return store.dispatch('tagsView/delRightTags', obj || router.currentRoute) + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute) + }, + // 添加tab页签 + openPage(title, url, params) { + const obj = { path: url, meta: { title: title } } + store.dispatch('tagsView/addView', obj) + return router.push({ path: url, query: params }) + }, + // 修改tab页签 + updatePage(obj) { + return store.dispatch('tagsView/updateVisitedView', obj) + } +} diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 00000000..2dd6e790 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,189 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * Note: 路由配置项 + * + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 + * roles: ['admin', 'common'] // 访问路由的角色权限 + * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 false) + title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 + icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg + breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + } + */ + +// 公共路由 +export const constantRoutes = [ + { + path: '/redirect', + component: Layout, + hidden: true, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login'), + hidden: true + }, + { + path: '/register', + component: () => import('@/views/register'), + hidden: true + }, + { + path: '/404', + component: () => import('@/views/error/404'), + hidden: true + }, + { + path: '/401', + component: () => import('@/views/error/401'), + hidden: true + }, + { + path: '', + component: Layout, + redirect: 'index', + children: [ + { + path: 'index', + component: () => import('@/views/index'), + name: 'Index', + meta: { title: '首页', icon: 'dashboard', affix: true } + } + ] + }, + { + path: '/lock', + component: () => import('@/views/lock'), + hidden: true, + meta: { title: '锁定屏幕' } + }, + { + path: '/user', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'profile', + component: () => import('@/views/system/user/profile/index'), + name: 'Profile', + meta: { title: '个人中心', icon: 'user' } + } + ] + } +] + +// 动态路由,基于用户权限动态去加载 +export const dynamicRoutes = [ + { + path: '/system/user-auth', + component: Layout, + hidden: true, + permissions: ['system:user:edit'], + children: [ + { + path: 'role/:userId(\\d+)', + component: () => import('@/views/system/user/authRole'), + name: 'AuthRole', + meta: { title: '分配角色', activeMenu: '/system/user' } + } + ] + }, + { + path: '/system/role-auth', + component: Layout, + hidden: true, + permissions: ['system:role:edit'], + children: [ + { + path: 'user/:roleId(\\d+)', + component: () => import('@/views/system/role/authUser'), + name: 'AuthUser', + meta: { title: '分配用户', activeMenu: '/system/role' } + } + ] + }, + { + path: '/system/dict-data', + component: Layout, + hidden: true, + permissions: ['system:dict:list'], + children: [ + { + path: 'index/:dictId(\\d+)', + component: () => import('@/views/system/dict/data'), + name: 'Data', + meta: { title: '字典数据', activeMenu: '/system/dict' } + } + ] + }, + { + path: '/monitor/job-log', + component: Layout, + hidden: true, + permissions: ['monitor:job:list'], + children: [ + { + path: 'index/:jobId(\\d+)', + component: () => import('@/views/monitor/job/log'), + name: 'JobLog', + meta: { title: '调度日志', activeMenu: '/monitor/job' } + } + ] + }, + { + path: '/tool/gen-edit', + component: Layout, + hidden: true, + permissions: ['tool:gen:edit'], + children: [ + { + path: 'index/:tableId(\\d+)', + component: () => import('@/views/tool/gen/editTable'), + name: 'GenEdit', + meta: { title: '修改生成配置', activeMenu: '/tool/gen' } + } + ] + } +] + +// 防止连续点击多次路由报错 +let routerPush = Router.prototype.push +let routerReplace = Router.prototype.replace +// push +Router.prototype.push = function push(location) { + return routerPush.call(this, location).catch(err => err) +} +// replace +Router.prototype.replace = function push(location) { + return routerReplace.call(this, location).catch(err => err) +} + +export default new Router({ + mode: 'history', // 去掉url中的# + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) diff --git a/frontend/src/settings.js b/frontend/src/settings.js new file mode 100644 index 00000000..174cfa31 --- /dev/null +++ b/frontend/src/settings.js @@ -0,0 +1,66 @@ +module.exports = { + /** + * 网页标题 + */ + title: process.env.VUE_APP_TITLE, + + /** + * 侧边栏主题 深色主题theme-dark,浅色主题theme-light + */ + sideTheme: 'theme-dark', + + /** + * 系统布局配置 + */ + showSettings: true, + + /** + * 菜单导航模式 1、纯左侧 2、混合(左侧+顶部) 3、纯顶部 + */ + navType: 1, + + /** + * 是否显示 tagsView + */ + tagsView: true, + + /** + * 持久化标签页 + */ + tagsViewPersist: false, + + /** + * 显示页签图标 + */ + tagsIcon: false, + + /** + * 标签页样式:card 卡片(默认)、chrome 谷歌浏览器风格 + */ + tagsViewStyle: 'card', + + /** + * 是否固定头部 + */ + fixedHeader: true, + + /** + * 是否显示logo + */ + sidebarLogo: true, + + /** + * 是否显示动态标题 + */ + dynamicTitle: false, + + /** + * 是否显示底部版权 + */ + footerVisible: false, + + /** + * 底部版权文本内容 + */ + footerContent: 'Copyright © 2018-2026 roomroot. All Rights Reserved.' +} diff --git a/frontend/src/shims-modules.d.ts b/frontend/src/shims-modules.d.ts new file mode 100644 index 00000000..d7b3a710 --- /dev/null +++ b/frontend/src/shims-modules.d.ts @@ -0,0 +1,21 @@ +declare module 'fuse.js/dist/fuse.min.js' { + const Fuse: any + export default Fuse +} + +declare module 'compression-webpack-plugin' { + const CompressionPlugin: any + export default CompressionPlugin +} + +declare module 'vuex' { + export function mapState(...args: any[]): any + export function mapGetters(...args: any[]): any + export function mapMutations(...args: any[]): any + export function mapActions(...args: any[]): any + export function createNamespacedHelpers(...args: any[]): any + const Store: any + export { Store } + const Vuex: any + export default Vuex +} diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js new file mode 100644 index 00000000..375a04be --- /dev/null +++ b/frontend/src/store/getters.js @@ -0,0 +1,23 @@ +const getters = { + sidebar: state => state.app.sidebar, + size: state => state.app.size, + device: state => state.app.device, + dict: state => state.dict.dict, + isLock: state => state.lock.isLock, + lockPath: state => state.lock.lockPath, + visitedViews: state => state.tagsView.visitedViews, + cachedViews: state => state.tagsView.cachedViews, + token: state => state.user.token, + avatar: state => state.user.avatar, + id: state => state.user.id, + name: state => state.user.name, + nickName: state => state.user.nickName, + introduction: state => state.user.introduction, + roles: state => state.user.roles, + permissions: state => state.user.permissions, + permission_routes: state => state.permission.routes, + topbarRouters: state => state.permission.topbarRouters, + defaultRoutes: state => state.permission.defaultRoutes, + sidebarRouters: state => state.permission.sidebarRouters +} +export default getters diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js new file mode 100644 index 00000000..d1d505a6 --- /dev/null +++ b/frontend/src/store/index.js @@ -0,0 +1,27 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import app from './modules/app' +import lock from './modules/lock' +import dict from './modules/dict' +import user from './modules/user' +import tagsView from './modules/tagsView' +import permission from './modules/permission' +import settings from './modules/settings' +import getters from './getters' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + lock, + dict, + user, + tagsView, + permission, + settings + }, + getters +}) + +export default store diff --git a/frontend/src/store/modules/app.js b/frontend/src/store/modules/app.js new file mode 100644 index 00000000..29c70a59 --- /dev/null +++ b/frontend/src/store/modules/app.js @@ -0,0 +1,66 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false, + hide: false + }, + device: 'desktop', + size: Cookies.get('size') || 'medium' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + if (state.sidebar.hide) { + return false + } + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + SET_SIZE: (state, size) => { + state.size = size + Cookies.set('size', size) + }, + SET_SIDEBAR_HIDE: (state, status) => { + state.sidebar.hide = status + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + setSize({ commit }, size) { + commit('SET_SIZE', size) + }, + toggleSideBarHide({ commit }, status) { + commit('SET_SIDEBAR_HIDE', status) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/frontend/src/store/modules/dict.js b/frontend/src/store/modules/dict.js new file mode 100644 index 00000000..5b501368 --- /dev/null +++ b/frontend/src/store/modules/dict.js @@ -0,0 +1,50 @@ +const state = { + dict: new Array() +} +const mutations = { + SET_DICT: (state, { key, value }) => { + if (key !== null && key !== "") { + state.dict.push({ + key: key, + value: value + }) + } + }, + REMOVE_DICT: (state, key) => { + try { + for (let i = 0; i < state.dict.length; i++) { + if (state.dict[i].key == key) { + state.dict.splice(i, 1) + return true + } + } + } catch (e) { + } + }, + CLEAN_DICT: (state) => { + state.dict = new Array() + } +} + +const actions = { + // 设置字典 + setDict({ commit }, data) { + commit('SET_DICT', data) + }, + // 删除字典 + removeDict({ commit }, key) { + commit('REMOVE_DICT', key) + }, + // 清空字典 + cleanDict({ commit }) { + commit('CLEAN_DICT') + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/frontend/src/store/modules/lock.js b/frontend/src/store/modules/lock.js new file mode 100644 index 00000000..bc496eba --- /dev/null +++ b/frontend/src/store/modules/lock.js @@ -0,0 +1,34 @@ +const LOCK_KEY = 'screen-lock' +const LOCK_PATH_KEY = 'screen-lock-path' + +const lock = { + namespaced: true, + state: { + isLock: JSON.parse(localStorage.getItem(LOCK_KEY) || 'false'), + lockPath: localStorage.getItem(LOCK_PATH_KEY) || '/index' + }, + mutations: { + SET_LOCK(state, status) { + state.isLock = status + localStorage.setItem(LOCK_KEY, JSON.stringify(status)) + }, + SET_LOCK_PATH(state, path) { + state.lockPath = path + localStorage.setItem(LOCK_PATH_KEY, path) + } + }, + actions: { + // 锁定屏幕,同时记录当前路径 + lockScreen({ commit }, currentPath) { + commit('SET_LOCK_PATH', currentPath || '/index') + commit('SET_LOCK', true) + }, + // 解锁屏幕,清除路径 + unlockScreen({ commit }) { + commit('SET_LOCK', false) + commit('SET_LOCK_PATH', '/index') + } + } +} + +export default lock diff --git a/frontend/src/store/modules/permission.js b/frontend/src/store/modules/permission.js new file mode 100644 index 00000000..b549ef07 --- /dev/null +++ b/frontend/src/store/modules/permission.js @@ -0,0 +1,122 @@ +import auth from '@/plugins/auth' +import router, { constantRoutes, dynamicRoutes } from '@/router' +import { getRouters } from '@/api/menu' +import Layout from '@/layout/index' +import ParentView from '@/components/ParentView' +import InnerLink from '@/layout/components/InnerLink' + +const permission = { + state: { + routes: [], + addRoutes: [], + defaultRoutes: [], + topbarRouters: [], + sidebarRouters: [] + }, + mutations: { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + }, + SET_DEFAULT_ROUTES: (state, routes) => { + state.defaultRoutes = constantRoutes.concat(routes) + }, + SET_TOPBAR_ROUTES: (state, routes) => { + state.topbarRouters = routes + }, + SET_SIDEBAR_ROUTERS: (state, routes) => { + state.sidebarRouters = routes + }, + }, + actions: { + // 生成路由 + GenerateRoutes({ commit }) { + return new Promise(resolve => { + // 向后端请求路由数据 + getRouters().then(res => { + const sdata = JSON.parse(JSON.stringify(res.data)) + const rdata = JSON.parse(JSON.stringify(res.data)) + const sidebarRoutes = filterAsyncRouter(sdata) + const rewriteRoutes = filterAsyncRouter(rdata, false, true) + const asyncRoutes = filterDynamicRoutes(dynamicRoutes) + rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) + router.addRoutes(asyncRoutes) + commit('SET_ROUTES', rewriteRoutes) + commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes)) + commit('SET_DEFAULT_ROUTES', sidebarRoutes) + commit('SET_TOPBAR_ROUTES', sidebarRoutes) + resolve(rewriteRoutes) + }) + }) + } + } +} + +// 遍历后台传来的路由字符串,转换为组件对象 +function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { + return asyncRouterMap.filter(route => { + if (type && route.children) { + route.children = filterChildren(route.children) + } + if (route.component) { + // Layout ParentView 组件特殊处理 + if (route.component === 'Layout') { + route.component = Layout + } else if (route.component === 'ParentView') { + route.component = ParentView + } else if (route.component === 'InnerLink') { + route.component = InnerLink + } else { + route.component = loadView(route.component) + } + } + if (route.children != null && route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, route, type) + } else { + delete route['children'] + delete route['redirect'] + } + return true + }) +} + +function filterChildren(childrenMap, lastRouter = false) { + var children = [] + childrenMap.forEach(el => { + el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path + if (el.children && el.children.length && el.component === 'ParentView') { + children = children.concat(filterChildren(el.children, el)) + } else { + children.push(el) + } + }) + return children +} + +// 动态路由遍历,验证是否具备权限 +export function filterDynamicRoutes(routes) { + const res = [] + routes.forEach(route => { + if (route.permissions) { + if (auth.hasPermiOr(route.permissions)) { + res.push(route) + } + } else if (route.roles) { + if (auth.hasRoleOr(route.roles)) { + res.push(route) + } + } + }) + return res +} + +export const loadView = (view) => { + if (process.env.NODE_ENV === 'development') { + return (resolve) => require([`@/views/${view}`], resolve) + } else { + // 使用 import 实现生产环境的路由懒加载 + return () => import(`@/views/${view}`) + } +} + +export default permission diff --git a/frontend/src/store/modules/settings.js b/frontend/src/store/modules/settings.js new file mode 100644 index 00000000..b5bbb1fe --- /dev/null +++ b/frontend/src/store/modules/settings.js @@ -0,0 +1,52 @@ +import defaultSettings from '@/settings' +import { useDynamicTitle } from '@/utils/dynamicTitle' + +const { sideTheme, showSettings, navType, tagsView, tagsViewPersist, tagsIcon, tagsViewStyle, fixedHeader, sidebarLogo, dynamicTitle, footerVisible, footerContent } = defaultSettings + +const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' +const state = { + title: '', + theme: storageSetting.theme || '#00875A', + sideTheme: storageSetting.sideTheme || sideTheme, + showSettings: showSettings, + navType: storageSetting.navType === undefined ? navType : storageSetting.navType, + tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, + tagsViewPersist: storageSetting.tagsViewPersist === undefined ? tagsViewPersist : storageSetting.tagsViewPersist, + tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon, + tagsViewStyle: storageSetting.tagsViewStyle === undefined ? tagsViewStyle : storageSetting.tagsViewStyle, + fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, + sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle, + footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible, + footerContent: footerContent +} +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + if (state.hasOwnProperty(key)) { + state[key] = value + } + }, + SET_TITLE: (state, title) => { + state.title = title + } +} + +const actions = { + // 修改布局设置 + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + }, + // 设置网页标题 + setTitle({ commit }, title) { + commit('SET_TITLE', title) + useDynamicTitle() + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/frontend/src/store/modules/tagsView.js b/frontend/src/store/modules/tagsView.js new file mode 100644 index 00000000..29864947 --- /dev/null +++ b/frontend/src/store/modules/tagsView.js @@ -0,0 +1,275 @@ +import store from '@/store' +import cache from '@/plugins/cache' + +const PERSIST_KEY = 'tags-view-visited' + +function isPersistEnabled() { + return store.state.settings.tagsViewPersist +} + +function saveVisitedViews(views) { + if (!isPersistEnabled()) return + const toSave = views.filter(v => !(v.meta && v.meta.affix)).map(v => ({ path: v.path, fullPath: v.fullPath, name: v.name, title: v.title, query: v.query, meta: v.meta })) + cache.local.setJSON(PERSIST_KEY, toSave) +} + +function loadVisitedViews() { + return cache.local.getJSON(PERSIST_KEY) || [] +} + +function clearVisitedViews() { + cache.local.remove(PERSIST_KEY) +} + +const state = { + visitedViews: [], + cachedViews: [], + iframeViews: [] +} + +const mutations = { + ADD_IFRAME_VIEW: (state, view) => { + if (state.iframeViews.some(v => v.path === view.path)) return + state.iframeViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_VISITED_VIEW: (state, view) => { + if (state.visitedViews.some(v => v.path === view.path)) return + state.visitedViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + saveVisitedViews(state.visitedViews) + }, + ADD_VISITED_VIEW_FIRST: (state, view) => { + if (state.visitedViews.some(v => v.path === view.path)) return + state.visitedViews.unshift( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_CACHED_VIEW: (state, view) => { + if (state.cachedViews.includes(view.name)) return + if (view.meta && !view.meta.noCache) { + state.cachedViews.push(view.name) + } + }, + DEL_VISITED_VIEW: (state, view) => { + for (const [i, v] of state.visitedViews.entries()) { + if (v.path === view.path) { + state.visitedViews.splice(i, 1) + break + } + } + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + saveVisitedViews(state.visitedViews) + }, + DEL_IFRAME_VIEW: (state, view) => { + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_CACHED_VIEW: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + index > -1 && state.cachedViews.splice(index, 1) + }, + + DEL_OTHERS_VISITED_VIEWS: (state, view) => { + state.visitedViews = state.visitedViews.filter(v => { + return v.meta.affix || v.path === view.path + }) + state.iframeViews = state.iframeViews.filter(item => item.path === view.path) + saveVisitedViews(state.visitedViews) + }, + DEL_OTHERS_CACHED_VIEWS: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + if (index > -1) { + state.cachedViews = state.cachedViews.slice(index, index + 1) + } else { + state.cachedViews = [] + } + }, + DEL_ALL_VISITED_VIEWS: state => { + // keep affix tags + const affixTags = state.visitedViews.filter(tag => tag.meta.affix) + state.visitedViews = affixTags + state.iframeViews = [] + clearVisitedViews() + }, + DEL_ALL_CACHED_VIEWS: state => { + state.cachedViews = [] + }, + UPDATE_VISITED_VIEW: (state, view) => { + for (let v of state.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + DEL_RIGHT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx <= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if (item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + saveVisitedViews(state.visitedViews) + }, + DEL_LEFT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx >= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if (item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + saveVisitedViews(state.visitedViews) + } +} + +const actions = { + addView({ dispatch }, view) { + dispatch('addVisitedView', view) + dispatch('addCachedView', view) + }, + addIframeView({ commit }, view) { + commit('ADD_IFRAME_VIEW', view) + }, + addVisitedView({ commit }, view) { + commit('ADD_VISITED_VIEW', view) + }, + addAffixView({ commit }, view) { + commit('ADD_VISITED_VIEW_FIRST', view) + }, + addCachedView({ commit }, view) { + commit('ADD_CACHED_VIEW', view) + }, + delView({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delVisitedView', view) + dispatch('delCachedView', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delVisitedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_VISITED_VIEW', view) + resolve([...state.visitedViews]) + }) + }, + delIframeView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_IFRAME_VIEW', view) + resolve([...state.iframeViews]) + }) + }, + delCachedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_CACHED_VIEW', view) + resolve([...state.cachedViews]) + }) + }, + delOthersViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delOthersVisitedViews', view) + dispatch('delOthersCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delOthersVisitedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_VISITED_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delOthersCachedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_CACHED_VIEWS', view) + resolve([...state.cachedViews]) + }) + }, + delAllViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delAllVisitedViews', view) + dispatch('delAllCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delAllVisitedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_VISITED_VIEWS') + resolve([...state.visitedViews]) + }) + }, + delAllCachedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_CACHED_VIEWS') + resolve([...state.cachedViews]) + }) + }, + updateVisitedView({ commit }, view) { + commit('UPDATE_VISITED_VIEW', view) + }, + delRightTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_RIGHT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delLeftTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_LEFT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + // 恢复持久化的 tags + loadPersistedViews({ commit }) { + const views = loadVisitedViews() + views.forEach(view => { + commit('ADD_VISITED_VIEW', view) + }) + }, +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/frontend/src/store/modules/user.js b/frontend/src/store/modules/user.js new file mode 100644 index 00000000..82d41884 --- /dev/null +++ b/frontend/src/store/modules/user.js @@ -0,0 +1,129 @@ +import store from '@/store' +import router from '@/router' +import cache from '@/plugins/cache' +import { MessageBox } from 'element-ui' +import { login, logout, getInfo } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { isHttp, isEmpty } from "@/utils/validate" +import defAva from '@/assets/images/profile.jpg' + +const user = { + state: { + token: getToken(), + id: '', + name: '', + nickName: '', + avatar: '', + roles: [], + permissions: [] + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_ID: (state, id) => { + state.id = id + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_NICK_NAME: (state, nickName) => { + state.nickName = nickName + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles + }, + SET_PERMISSIONS: (state, permissions) => { + state.permissions = permissions + } + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(username, password, code, uuid).then(res => { + setToken(res.token) + commit('SET_TOKEN', res.token) + store.dispatch('lock/unlockScreen') + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.user + let avatar = user.avatar || "" + if (!isHttp(avatar)) { + avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar + } + if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + commit('SET_ROLES', res.roles) + commit('SET_PERMISSIONS', res.permissions) + } else { + commit('SET_ROLES', ['ROLE_DEFAULT']) + } + commit('SET_ID', user.userId) + commit('SET_NAME', user.userName) + commit('SET_NICK_NAME', user.nickName) + commit('SET_AVATAR', avatar) + cache.session.set('pwrChrtype', res.pwdChrtype) + /* 初始密码提示 */ + if(res.isDefaultModifyPwd) { + MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => {}) + } + /* 过期密码提示 */ + if(!res.isDefaultModifyPwd && res.isPasswordExpired) { + MessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => {}) + } + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + + // 退出系统 + LogOut({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + commit('SET_PERMISSIONS', []) + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 前端 登出 + FedLogOut({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + removeToken() + resolve() + }) + } + } +} + +export default user diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js new file mode 100644 index 00000000..51a5f6e4 --- /dev/null +++ b/frontend/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'Admin-Token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/frontend/src/utils/dict/Dict.js b/frontend/src/utils/dict/Dict.js new file mode 100644 index 00000000..db9f1590 --- /dev/null +++ b/frontend/src/utils/dict/Dict.js @@ -0,0 +1,82 @@ +import Vue from 'vue' +import { mergeRecursive } from "@/utils/roomroot" +import DictMeta from './DictMeta' +import DictData from './DictData' + +const DEFAULT_DICT_OPTIONS = { + types: [], +} + +/** + * @classdesc 字典 + * @property {Object} label 标签对象,内部属性名为字典类型名称 + * @property {Object} dict 字段数组,内部属性名为字典类型名称 + * @property {Array.} _dictMetas 字典元数据数组 + */ +export default class Dict { + constructor() { + this.owner = null + this.label = {} + this.type = {} + } + + init(options) { + if (options instanceof Array) { + options = { types: options } + } + const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) + if (opts.types === undefined) { + throw new Error('need dict types') + } + const ps = [] + this._dictMetas = opts.types.map(t => DictMeta.parse(t)) + this._dictMetas.forEach(dictMeta => { + const type = dictMeta.type + Vue.set(this.label, type, {}) + Vue.set(this.type, type, []) + if (dictMeta.lazy) { + return + } + ps.push(loadDict(this, dictMeta)) + }) + return Promise.all(ps) + } + + /** + * 重新加载字典 + * @param {String} type 字典类型 + */ + reloadDict(type) { + const dictMeta = this._dictMetas.find(e => e.type === type) + if (dictMeta === undefined) { + return Promise.reject(`the dict meta of ${type} was not found`) + } + return loadDict(this, dictMeta) + } +} + +/** + * 加载字典 + * @param {Dict} dict 字典 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {Promise} + */ +function loadDict(dict, dictMeta) { + return dictMeta.request(dictMeta) + .then(response => { + const type = dictMeta.type + let dicts = dictMeta.responseConverter(response, dictMeta) + if (!(dicts instanceof Array)) { + console.error('the return of responseConverter must be Array.') + dicts = [] + } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { + console.error('the type of elements in dicts must be DictData') + dicts = [] + } + dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) + dicts.forEach(d => { + Vue.set(dict.label[type], d.value, d.label) + }) + return dicts + }) +} diff --git a/frontend/src/utils/dict/DictConverter.js b/frontend/src/utils/dict/DictConverter.js new file mode 100644 index 00000000..2bd4f1c8 --- /dev/null +++ b/frontend/src/utils/dict/DictConverter.js @@ -0,0 +1,17 @@ +import DictOptions from './DictOptions' +import DictData from './DictData' + +export default function(dict, dictMeta) { + const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) + const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) + return new DictData(dict[label], dict[value], dict) +} + +/** + * 确定字典字段 + * @param {DictData} dict + * @param {...String} fields + */ +function determineDictField(dict, ...fields) { + return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) +} diff --git a/frontend/src/utils/dict/DictData.js b/frontend/src/utils/dict/DictData.js new file mode 100644 index 00000000..402ae606 --- /dev/null +++ b/frontend/src/utils/dict/DictData.js @@ -0,0 +1,13 @@ +/** + * @classdesc 字典数据 + * @property {String} label 标签 + * @property {*} value 标签 + * @property {Object} raw 原始数据 + */ +export default class DictData { + constructor(label, value, raw) { + this.label = label + this.value = value + this.raw = raw + } +} diff --git a/frontend/src/utils/dict/DictMeta.js b/frontend/src/utils/dict/DictMeta.js new file mode 100644 index 00000000..ac43591f --- /dev/null +++ b/frontend/src/utils/dict/DictMeta.js @@ -0,0 +1,38 @@ +import { mergeRecursive } from "@/utils/roomroot" +import DictOptions from './DictOptions' + +/** + * @classdesc 字典元数据 + * @property {String} type 类型 + * @property {Function} request 请求 + * @property {String} label 标签字段 + * @property {String} value 值字段 + */ +export default class DictMeta { + constructor(options) { + this.type = options.type + this.request = options.request + this.responseConverter = options.responseConverter + this.labelField = options.labelField + this.valueField = options.valueField + this.lazy = options.lazy === true + } +} + + +/** + * 解析字典元数据 + * @param {Object} options + * @returns {DictMeta} + */ +DictMeta.parse= function(options) { + let opts = null + if (typeof options === 'string') { + opts = DictOptions.metas[options] || {} + opts.type = options + } else if (typeof options === 'object') { + opts = options + } + opts = mergeRecursive(DictOptions.metas['*'], opts) + return new DictMeta(opts) +} diff --git a/frontend/src/utils/dict/DictOptions.js b/frontend/src/utils/dict/DictOptions.js new file mode 100644 index 00000000..e5165e54 --- /dev/null +++ b/frontend/src/utils/dict/DictOptions.js @@ -0,0 +1,51 @@ +import { mergeRecursive } from "@/utils/roomroot" +import dictConverter from './DictConverter' + +export const options = { + metas: { + '*': { + /** + * 字典请求,方法签名为function(dictMeta: DictMeta): Promise + */ + request: (dictMeta) => { + console.log(`load dict ${dictMeta.type}`) + return Promise.resolve([]) + }, + /** + * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData + */ + responseConverter, + labelField: 'label', + valueField: 'value', + }, + }, + /** + * 默认标签字段 + */ + DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'], + /** + * 默认值字段 + */ + DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'], +} + +/** + * 映射字典 + * @param {Object} response 字典数据 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {DictData} + */ +function responseConverter(response, dictMeta) { + const dicts = response.content instanceof Array ? response.content : response + if (dicts === undefined) { + console.warn(`no dict data of "${dictMeta.type}" found in the response`) + return [] + } + return dicts.map(d => dictConverter(d, dictMeta)) +} + +export function mergeOptions(src) { + mergeRecursive(options, src) +} + +export default options diff --git a/frontend/src/utils/dict/index.js b/frontend/src/utils/dict/index.js new file mode 100644 index 00000000..79ee16f8 --- /dev/null +++ b/frontend/src/utils/dict/index.js @@ -0,0 +1,33 @@ +import Dict from './Dict' +import { mergeOptions } from './DictOptions' + +export default function(Vue, options) { + mergeOptions(options) + Vue.mixin({ + data() { + if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { + return {} + } + const dict = new Dict() + dict.owner = this + return { + dict + } + }, + created() { + if (!(this.dict instanceof Dict)) { + return + } + options.onCreated && options.onCreated(this.dict) + this.dict.init(this.$options.dicts).then(() => { + options.onReady && options.onReady(this.dict) + this.$nextTick(() => { + this.$emit('dictReady', this.dict) + if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { + this.$options.methods.onDictReady.call(this, this.dict) + } + }) + }) + }, + }) +} diff --git a/frontend/src/utils/dynamicTitle.js b/frontend/src/utils/dynamicTitle.js new file mode 100644 index 00000000..605cfce4 --- /dev/null +++ b/frontend/src/utils/dynamicTitle.js @@ -0,0 +1,13 @@ +import store from '@/store' +import defaultSettings from '@/settings' + +/** + * 动态修改标题 + */ +export function useDynamicTitle() { + if (store.state.settings.dynamicTitle) { + document.title = store.state.settings.title + ' - ' + defaultSettings.title + } else { + document.title = defaultSettings.title + } +} \ No newline at end of file diff --git a/frontend/src/utils/errorCode.js b/frontend/src/utils/errorCode.js new file mode 100644 index 00000000..62640f37 --- /dev/null +++ b/frontend/src/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/frontend/src/utils/generator/config.js b/frontend/src/utils/generator/config.js new file mode 100644 index 00000000..72417393 --- /dev/null +++ b/frontend/src/utils/generator/config.js @@ -0,0 +1,438 @@ +export const formConf = { + formRef: 'elForm', + formModel: 'formData', + size: 'medium', + labelPosition: 'right', + labelWidth: 100, + formRules: 'rules', + gutter: 15, + disabled: false, + span: 24, + formBtns: true +} + +export const inputComponents = [ + { + label: '单行文本', + tag: 'el-input', + tagIcon: 'input', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '多行文本', + tag: 'el-input', + tagIcon: 'textarea', + type: 'textarea', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + autosize: { + minRows: 4, + maxRows: 4 + }, + style: { width: '100%' }, + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '密码', + tag: 'el-input', + tagIcon: 'password', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + 'show-password': true, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '计数器', + tag: 'el-input-number', + tagIcon: 'number', + placeholder: '', + defaultValue: undefined, + span: 24, + labelWidth: null, + min: undefined, + max: undefined, + step: undefined, + 'step-strictly': false, + precision: undefined, + 'controls-position': '', + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input-number' + } +] + +export const selectComponents = [ + { + label: '下拉选择', + tag: 'el-select', + tagIcon: 'select', + placeholder: '请选择', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + disabled: false, + required: true, + filterable: false, + multiple: false, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/select' + }, + { + label: '级联选择', + tag: 'el-cascader', + tagIcon: 'cascader', + placeholder: '请选择', + defaultValue: [], + span: 24, + labelWidth: null, + style: { width: '100%' }, + props: { + props: { + multiple: false + } + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + required: true, + options: [{ + id: 1, + value: 1, + label: '选项1', + children: [{ + id: 2, + value: 2, + label: '选项1-1' + }] + }], + dataType: 'dynamic', + labelKey: 'label', + valueKey: 'value', + childrenKey: 'children', + separator: '/', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/cascader' + }, + { + label: '单选框组', + tag: 'el-radio-group', + tagIcon: 'radio', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/radio' + }, + { + label: '多选框组', + tag: 'el-checkbox-group', + tagIcon: 'checkbox', + defaultValue: [], + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/checkbox' + }, + { + label: '开关', + tag: 'el-switch', + tagIcon: 'switch', + defaultValue: false, + span: 24, + labelWidth: null, + style: {}, + disabled: false, + required: true, + 'active-text': '', + 'inactive-text': '', + 'active-color': null, + 'inactive-color': null, + 'active-value': true, + 'inactive-value': false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/switch' + }, + { + label: '滑块', + tag: 'el-slider', + tagIcon: 'slider', + defaultValue: null, + span: 24, + labelWidth: null, + disabled: false, + required: true, + min: 0, + max: 100, + step: 1, + 'show-stops': false, + range: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/slider' + }, + { + label: '时间选择', + tag: 'el-time-picker', + tagIcon: 'time', + placeholder: '请选择', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'picker-options': { + selectableRange: '00:00:00-23:59:59' + }, + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '时间范围', + tag: 'el-time-picker', + tagIcon: 'time-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'is-range': true, + 'range-separator': '至', + 'start-placeholder': '开始时间', + 'end-placeholder': '结束时间', + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '日期选择', + tag: 'el-date-picker', + tagIcon: 'date', + placeholder: '请选择', + defaultValue: null, + type: 'date', + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '日期范围', + tag: 'el-date-picker', + tagIcon: 'date-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + type: 'daterange', + 'range-separator': '至', + 'start-placeholder': '开始日期', + 'end-placeholder': '结束日期', + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '评分', + tag: 'el-rate', + tagIcon: 'rate', + defaultValue: 0, + span: 24, + labelWidth: null, + style: {}, + max: 5, + 'allow-half': false, + 'show-text': false, + 'show-score': false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/rate' + }, + { + label: '颜色选择', + tag: 'el-color-picker', + tagIcon: 'color', + defaultValue: null, + labelWidth: null, + 'show-alpha': false, + 'color-format': '', + disabled: false, + required: true, + size: 'medium', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/color-picker' + }, + { + label: '上传', + tag: 'el-upload', + tagIcon: 'upload', + action: 'https://jsonplaceholder.typicode.com/posts/', + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + accept: '', + name: 'file', + 'auto-upload': true, + showTip: false, + buttonText: '点击上传', + fileSize: 2, + sizeUnit: 'MB', + 'list-type': 'text', + multiple: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/upload' + } +] + +export const layoutComponents = [ + { + layout: 'rowFormItem', + tagIcon: 'row', + type: 'default', + justify: 'start', + align: 'top', + label: '行容器', + layoutTree: true, + children: [], + document: 'https://element.eleme.cn/#/zh-CN/component/layout' + }, + { + layout: 'colFormItem', + label: '按钮', + changeTag: true, + labelWidth: null, + tag: 'el-button', + tagIcon: 'button', + span: 24, + default: '主要按钮', + type: 'primary', + icon: 'el-icon-search', + size: 'medium', + disabled: false, + document: 'https://element.eleme.cn/#/zh-CN/component/button' + } +] + +// 组件rule的触发方式,无触发方式的组件不生成rule +export const trigger = { + 'el-input': 'blur', + 'el-input-number': 'blur', + 'el-select': 'change', + 'el-radio-group': 'change', + 'el-checkbox-group': 'change', + 'el-cascader': 'change', + 'el-time-picker': 'change', + 'el-date-picker': 'change', + 'el-rate': 'change' +} diff --git a/frontend/src/utils/generator/css.js b/frontend/src/utils/generator/css.js new file mode 100644 index 00000000..d6830ec6 --- /dev/null +++ b/frontend/src/utils/generator/css.js @@ -0,0 +1,18 @@ +const styles = { + 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', + 'el-upload': '.el-upload__tip{line-height: 1.2;}' +} + +function addCss(cssList, el) { + const css = styles[el.tag] + css && cssList.indexOf(css) === -1 && cssList.push(css) + if (el.children) { + el.children.forEach(el2 => addCss(cssList, el2)) + } +} + +export function makeUpCss(conf) { + const cssList = [] + conf.fields.forEach(el => addCss(cssList, el)) + return cssList.join('\n') +} diff --git a/frontend/src/utils/generator/drawingDefault.js b/frontend/src/utils/generator/drawingDefault.js new file mode 100644 index 00000000..0b9ad2c3 --- /dev/null +++ b/frontend/src/utils/generator/drawingDefault.js @@ -0,0 +1,37 @@ +export const drawingDefaultValue = [] + +export function initDrawingDefaultValue() { + if (drawingDefaultValue.length === 0) { + drawingDefaultValue.push({ + layout: 'colFormItem', + tagIcon: 'input', + label: '手机号', + vModel: 'mobile', + formId: 6, + tag: 'el-input', + placeholder: '请输入手机号', + defaultValue: '', + span: 24, + style: {width: '100%'}, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': 'el-icon-mobile', + 'suffix-icon': '', + maxlength: 11, + 'show-word-limit': true, + readonly: false, + disabled: false, + required: true, + changeTag: true, + regList: [{ + pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', + message: '手机号格式错误' + }] + }) + } +} + +export function cleanDrawingDefaultValue() { + drawingDefaultValue.splice(0, drawingDefaultValue.length) +} diff --git a/frontend/src/utils/generator/html.js b/frontend/src/utils/generator/html.js new file mode 100644 index 00000000..c1d7950f --- /dev/null +++ b/frontend/src/utils/generator/html.js @@ -0,0 +1,358 @@ +import { trigger } from './config' + +let confGlobal +let someSpanIsNot24 + +export function dialogWrapper(str) { + return ` + ${str} +
+ 取消 + 确定 +
+
` +} + +export function vueTemplate(str) { + return `` +} + +export function vueScript(str) { + return `` +} + +export function cssStyle(cssStr) { + return `` +} + +function buildFormTemplate(conf, child, type) { + let labelPosition = '' + if (conf.labelPosition !== 'right') { + labelPosition = `label-position="${conf.labelPosition}"` + } + const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' + let str = ` + ${child} + ${buildFromBtns(conf, type)} + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + return str +} + +function buildFromBtns(conf, type) { + let str = '' + if (conf.formBtns && type === 'file') { + str = ` + 提交 + 重置 + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + } + return str +} + +// span不为24的用el-col包裹 +function colWrapper(element, str) { + if (someSpanIsNot24 || element.span !== 24) { + return ` + ${str} + ` + } + return str +} + +const layouts = { + colFormItem(element) { + let labelWidth = '' + if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { + labelWidth = `label-width="${element.labelWidth}px"` + } + const required = !trigger[element.tag] && element.required ? 'required' : '' + const tagDom = tags[element.tag] ? tags[element.tag](element) : null + let str = ` + ${tagDom} + ` + str = colWrapper(element, str) + return str + }, + rowFormItem(element) { + const type = element.type === 'default' ? '' : `type="${element.type}"` + const justify = element.type === 'default' ? '' : `justify="${element.justify}"` + const align = element.type === 'default' ? '' : `align="${element.align}"` + const gutter = element.gutter ? `gutter="${element.gutter}"` : '' + const children = element.children.map(el => layouts[el.layout](el)) + let str = ` + ${children.join('\n')} + ` + str = colWrapper(element, str) + return str + } +} + +const tags = { + 'el-button': el => { + const { + tag, disabled + } = attrBuilder(el) + const type = el.type ? `type="${el.type}"` : '' + const icon = el.icon ? `icon="${el.icon}"` : '' + const size = el.size ? `size="${el.size}"` : '' + let child = buildElButtonChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}` + }, + 'el-input': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' + const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' + const readonly = el.readonly ? 'readonly' : '' + const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' + const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' + const showPassword = el['show-password'] ? 'show-password' : '' + const type = el.type ? `type="${el.type}"` : '' + const autosize = el.autosize && el.autosize.minRows + ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` + : '' + let child = buildElInputChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` + }, + 'el-input-number': el => { + const { disabled, vModel, placeholder } = attrBuilder(el) + const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' + const precision = el.precision ? `:precision='${el.precision}'` : '' + + return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` + }, + 'el-select': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const filterable = el.filterable ? 'filterable' : '' + const multiple = el.multiple ? 'multiple' : '' + let child = buildElSelectChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` + }, + 'el-radio-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + let child = buildElRadioGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${size} ${disabled}>${child}` + }, + 'el-checkbox-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const min = el.min ? `:min="${el.min}"` : '' + const max = el.max ? `:max="${el.max}"` : '' + let child = buildElCheckboxGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` + }, + 'el-switch': el => { + const { disabled, vModel } = attrBuilder(el) + const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' + const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' + const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' + const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' + const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' + const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' + + return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` + }, + 'el-cascader': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const options = el.options ? `:options="${el.vModel}Options"` : '' + const props = el.props ? `:props="${el.vModel}Props"` : '' + const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' + const filterable = el.filterable ? 'filterable' : '' + const separator = el.separator === '/' ? '' : `separator="${el.separator}"` + + return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` + }, + 'el-slider': el => { + const { disabled, vModel } = attrBuilder(el) + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const range = el.range ? 'range' : '' + const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' + + return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` + }, + 'el-time-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const isRange = el['is-range'] ? 'is-range' : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' + + return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` + }, + 'el-date-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const type = el.type === 'date' ? '' : `type="${el.type}"` + const readonly = el.readonly ? 'readonly' : '' + + return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` + }, + 'el-rate': el => { + const { disabled, vModel } = attrBuilder(el) + const max = el.max ? `:max='${el.max}'` : '' + const allowHalf = el['allow-half'] ? 'allow-half' : '' + const showText = el['show-text'] ? 'show-text' : '' + const showScore = el['show-score'] ? 'show-score' : '' + + return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>` + }, + 'el-color-picker': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const showAlpha = el['show-alpha'] ? 'show-alpha' : '' + const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' + + return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` + }, + 'el-upload': el => { + const disabled = el.disabled ? ':disabled=\'true\'' : '' + const action = el.action ? `:action="${el.vModel}Action"` : '' + const multiple = el.multiple ? 'multiple' : '' + const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' + const accept = el.accept ? `accept="${el.accept}"` : '' + const name = el.name !== 'file' ? `name="${el.name}"` : '' + const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' + const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` + const fileList = `:file-list="${el.vModel}fileList"` + const ref = `ref="${el.vModel}"` + let child = buildElUploadChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` + } +} + +function attrBuilder(el) { + return { + vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, + clearable: el.clearable ? 'clearable' : '', + placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', + width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', + disabled: el.disabled ? ':disabled=\'true\'' : '' + } +} + +// el-buttin 子级 +function buildElButtonChild(conf) { + const children = [] + if (conf.default) { + children.push(conf.default) + } + return children.join('\n') +} + +// el-input innerHTML +function buildElInputChild(conf) { + const children = [] + if (conf.prepend) { + children.push(``) + } + if (conf.append) { + children.push(``) + } + return children.join('\n') +} + +function buildElSelectChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + children.push(``) + } + return children.join('\n') +} + +function buildElRadioGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElCheckboxGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElUploadChild(conf) { + const list = [] + if (conf['list-type'] === 'picture-card') list.push('') + else list.push(`${conf.buttonText}`) + if (conf.showTip) list.push(`
只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`) + return list.join('\n') +} + +export function makeUpHtml(conf, type) { + const htmlList = [] + confGlobal = conf + someSpanIsNot24 = conf.fields.some(item => item.span !== 24) + conf.fields.forEach(el => { + htmlList.push(layouts[el.layout](el)) + }) + const htmlStr = htmlList.join('\n') + + let temp = buildFormTemplate(conf, htmlStr, type) + if (type === 'dialog') { + temp = dialogWrapper(temp) + } + confGlobal = null + return temp +} diff --git a/frontend/src/utils/generator/icon.json b/frontend/src/utils/generator/icon.json new file mode 100644 index 00000000..2d9999a3 --- /dev/null +++ b/frontend/src/utils/generator/icon.json @@ -0,0 +1 @@ +["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"] \ No newline at end of file diff --git a/frontend/src/utils/generator/js.js b/frontend/src/utils/generator/js.js new file mode 100644 index 00000000..cde8bf24 --- /dev/null +++ b/frontend/src/utils/generator/js.js @@ -0,0 +1,235 @@ +import { exportDefault, titleCase } from '@/utils/index' +import { trigger } from './config' + +const units = { + KB: '1024', + MB: '1024 / 1024', + GB: '1024 / 1024 / 1024' +} +let confGlobal +const inheritAttrs = { + file: '', + dialog: 'inheritAttrs: false,' +} + + +export function makeUpJs(conf, type) { + confGlobal = conf = JSON.parse(JSON.stringify(conf)) + const dataList = [] + const ruleList = [] + const optionsList = [] + const propsList = [] + const methodList = mixinMethod(type) + const uploadVarList = [] + + conf.fields.forEach(el => { + buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + + const script = buildexport( + conf, + type, + dataList.join('\n'), + ruleList.join('\n'), + optionsList.join('\n'), + uploadVarList.join('\n'), + propsList.join('\n'), + methodList.join('\n') + ) + confGlobal = null + return script +} + +function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) { + buildData(el, dataList) + buildRules(el, ruleList) + + if (el.options && el.options.length) { + buildOptions(el, optionsList) + if (el.dataType === 'dynamic') { + const model = `${el.vModel}Options` + const options = titleCase(model) + buildOptionMethod(`get${options}`, model, methodList) + } + } + + if (el.props && el.props.props) { + buildProps(el, propsList) + } + + if (el.action && el.tag === 'el-upload') { + uploadVarList.push( + `${el.vModel}Action: '${el.action}', + ${el.vModel}fileList: [],` + ) + methodList.push(buildBeforeUpload(el)) + if (!el['auto-upload']) { + methodList.push(buildSubmitUpload(el)) + } + } + + if (el.children) { + el.children.forEach(el2 => { + buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + } +} + +function mixinMethod(type) { + const list = []; const + minxins = { + file: confGlobal.formBtns ? { + submitForm: `submitForm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + // TODO 提交表单 + }) + },`, + resetForm: `resetForm() { + this.$refs['${confGlobal.formRef}'].resetFields() + },` + } : null, + dialog: { + onOpen: 'onOpen() {},', + onClose: `onClose() { + this.$refs['${confGlobal.formRef}'].resetFields() + },`, + close: `close() { + this.$emit('update:visible', false) + },`, + handleConfirm: `handleConfirm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + this.close() + }) + },` + } + } + + const methods = minxins[type] + if (methods) { + Object.keys(methods).forEach(key => { + list.push(methods[key]) + }) + } + + return list +} + +function buildData(conf, dataList) { + if (conf.vModel === undefined) return + let defaultValue + if (typeof (conf.defaultValue) === 'string' && !conf.multiple) { + defaultValue = `'${conf.defaultValue}'` + } else { + defaultValue = `${JSON.stringify(conf.defaultValue)}` + } + dataList.push(`${conf.vModel}: ${defaultValue},`) +} + +function buildRules(conf, ruleList) { + if (conf.vModel === undefined) return + const rules = [] + if (trigger[conf.tag]) { + if (conf.required) { + const type = Array.isArray(conf.defaultValue) ? 'type: \'array\',' : '' + let message = Array.isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder + if (message === undefined) message = `${conf.label}不能为空` + rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`) + } + if (conf.regList && Array.isArray(conf.regList)) { + conf.regList.forEach(item => { + if (item.pattern) { + rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`) + } + }) + } + ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) + } +} + +function buildOptions(conf, optionsList) { + if (conf.vModel === undefined) return + if (conf.dataType === 'dynamic') { conf.options = [] } + const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},` + optionsList.push(str) +} + +function buildProps(conf, propsList) { + if (conf.dataType === 'dynamic') { + conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey) + conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey) + conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey) + } + const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},` + propsList.push(str) +} + +function buildBeforeUpload(conf) { + const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const + returnList = [] + if (conf.fileSize) { + rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} + if(!isRightSize){ + this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') + }` + returnList.push('isRightSize') + } + if (conf.accept) { + acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) + if(!isAccept){ + this.$message.error('应该选择${conf.accept}类型的文件') + }` + returnList.push('isAccept') + } + const str = `${conf.vModel}BeforeUpload(file) { + ${rightSizeCode} + ${acceptCode} + return ${returnList.join('&&')} + },` + return returnList.length ? str : '' +} + +function buildSubmitUpload(conf) { + const str = `submitUpload() { + this.$refs['${conf.vModel}'].submit() + },` + return str +} + +function buildOptionMethod(methodName, model, methodList) { + const str = `${methodName}() { + // TODO 发起请求获取数据 + this.${model} + },` + methodList.push(str) +} + +function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) { + const str = `${exportDefault}{ + ${inheritAttrs[type]} + components: {}, + props: [], + data () { + return { + ${conf.formModel}: { + ${data} + }, + ${conf.formRules}: { + ${rules} + }, + ${uploadVar} + ${selectOptions} + ${props} + } + }, + computed: {}, + watch: {}, + created () {}, + mounted () {}, + methods: { + ${methods} + } +}` + return str +} diff --git a/frontend/src/utils/generator/render.js b/frontend/src/utils/generator/render.js new file mode 100644 index 00000000..c312ae56 --- /dev/null +++ b/frontend/src/utils/generator/render.js @@ -0,0 +1,126 @@ +import { makeMap } from '@/utils/index' + +// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js +const isAttr = makeMap( + 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' + + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + + 'target,title,type,usemap,value,width,wrap' +) + +function vModel(self, dataObject, defaultValue) { + dataObject.props.value = defaultValue + + dataObject.on.input = val => { + self.$emit('input', val) + } +} + +const componentChild = { + 'el-button': { + default(h, conf, key) { + return conf[key] + }, + }, + 'el-input': { + prepend(h, conf, key) { + return + }, + append(h, conf, key) { + return + } + }, + 'el-select': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + list.push() + }) + return list + } + }, + 'el-radio-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') list.push({item.label}) + else list.push({item.label}) + }) + return list + } + }, + 'el-checkbox-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') { + list.push({item.label}) + } else { + list.push({item.label}) + } + }) + return list + } + }, + 'el-upload': { + 'list-type': (h, conf, key) => { + const list = [] + if (conf['list-type'] === 'picture-card') { + list.push() + } else { + list.push({conf.buttonText}) + } + if (conf.showTip) { + list.push(
只能上传不超过 {conf.fileSize}{conf.sizeUnit} 的{conf.accept}文件
) + } + return list + } + } +} + +export default { + render(h) { + const dataObject = { + attrs: {}, + props: {}, + on: {}, + style: {} + } + const confClone = JSON.parse(JSON.stringify(this.conf)) + const children = [] + + const childObjs = componentChild[confClone.tag] + if (childObjs) { + Object.keys(childObjs).forEach(key => { + const childFunc = childObjs[key] + if (confClone[key]) { + children.push(childFunc(h, confClone, key)) + } + }) + } + + Object.keys(confClone).forEach(key => { + const val = confClone[key] + if (key === 'vModel') { + vModel(this, dataObject, confClone.defaultValue) + } else if (dataObject[key]) { + dataObject[key] = val + } else if (!isAttr(key)) { + dataObject.props[key] = val + } else { + dataObject.attrs[key] = val + } + }) + return h(this.conf.tag, dataObject, children) + }, + props: ['conf'] +} diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js new file mode 100644 index 00000000..2a92f152 --- /dev/null +++ b/frontend/src/utils/index.js @@ -0,0 +1,390 @@ +import { parseTime } from './roomroot' + +/** + * 表格时间格式化 + */ +export function formatDate(cellValue) { + if (cellValue == null || cellValue == "") return "" + var date = new Date(cellValue) + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param {string} input value + * @returns {number} output value + */ +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += '' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()) + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result + + const later = function() { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args) + if (!timeout) context = args = null + } + } + } + + return function(...args) { + context = this + timestamp = +new Date() + const callNow = immediate && !timeout + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait) + if (callNow) { + result = func.apply(context, args) + context = args = null + } + + return result + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} + +export function makeMap(str, expectsLowerCase) { + const map = Object.create(null) + const list = str.split(',') + for (let i = 0; i < list.length; i++) { + map[list[i]] = true + } + return expectsLowerCase + ? val => map[val.toLowerCase()] + : val => map[val] +} + +export const exportDefault = 'export default ' + +export const beautifierConf = { + html: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'separate', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + js: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + } +} + +// 首字母大小 +export function titleCase(str) { + return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) +} + +// 下划转驼峰 +export function camelCase(str) { + return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) +} + +export function isNumberStr(str) { + return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) +} + diff --git a/frontend/src/utils/jsencrypt.js b/frontend/src/utils/jsencrypt.js new file mode 100644 index 00000000..0316c713 --- /dev/null +++ b/frontend/src/utils/jsencrypt.js @@ -0,0 +1,30 @@ +import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export function encrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export function decrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} + diff --git a/frontend/src/utils/passwordRule.js b/frontend/src/utils/passwordRule.js new file mode 100644 index 00000000..3f29680f --- /dev/null +++ b/frontend/src/utils/passwordRule.js @@ -0,0 +1,71 @@ +/** + * 密码强度规则 + * 根据参数 chrtype 动态生成校验规则 + * + * chrtype 说明: + * 0 - 任意字符(默认) + * 1 - 纯数字(0-9) + * 2 - 纯字母(a-z / A-Z) + * 3 - 字母 + 数字(必须同时包含) + * 4 - 字母 + 数字 + 特殊字符(必须同时包含,特殊字符:~!@#$%^&*()-=_+) + */ +import cache from '@/plugins/cache' + +// 各类型对应的正则、错误提示 +const PWD_RULES = { + '0': { pattern: /^[^<>"'|\\]+$/, message: '密码不能包含非法字符:< > " \' \\ |' }, + '1': { pattern: /^[0-9]+$/, message: '密码只能为数字(0-9)' }, + '2': { pattern: /^[a-zA-Z]+$/, message: '密码只能为英文字母(a-z、A-Z)' }, + '3': { pattern: /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$/, message: '密码必须同时包含字母和数字' }, + '4': { pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#$%^&*()\-=_+])[A-Za-z\d~!@#$%^&*()\-=_+]+$/, message: '密码必须同时包含字母、数字和特殊字符(~!@#$%^&*()-=_+)' } +} + +export default { + data() { + return { + // 密码限制类型 + pwdChrType: cache.session.get('pwrChrtype') || '0' + } + }, + computed: { + // 默认密码校验 + pwdValidator() { + const rule = PWD_RULES[this.pwdChrType] || PWD_RULES['0'] + return [ + { required: true, message: '密码不能为空', trigger: 'blur' }, + { min: 6, max: 20, message: '密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + }, + // 校验prompt的inputValidator函数 + pwdPromptValidator() { + const rule = PWD_RULES['0'] + return (value) => { + if (!value || value.length < 6 || value.length > 20) { + return '密码长度必须介于 6 和 20 之间' + } + if (!rule.pattern.test(value)) { + return rule.message + } + } + }, + // 个人中心密码校验 + infoPwdValidator() { + const rule = PWD_RULES[this.pwdChrType] || PWD_RULES['0'] + return [ + { required: true, message: '新密码不能为空', trigger: 'blur' }, + { min: 6, max: 20, message: '新密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + }, + // 注册页面密码校验 + registerPwdValidator() { + const rule = PWD_RULES['0'] + return [ + { required: true, message: '请输入您的密码', trigger: 'blur' }, + { min: 6, max: 20, message: '用户密码长度必须介于 6 和 20 之间', trigger: 'blur' }, + { pattern: rule.pattern, message: rule.message, trigger: 'blur' } + ] + } + } +} diff --git a/frontend/src/utils/permission.js b/frontend/src/utils/permission.js new file mode 100644 index 00000000..43998fa3 --- /dev/null +++ b/frontend/src/utils/permission.js @@ -0,0 +1,47 @@ +import store from '@/store' + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = store.getters && store.getters.permissions + const permissionDatas = value + const all_permission = "*:*:*" + + const hasPermission = permissions.some(permission => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + return hasPermission + + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = store.getters && store.getters.roles + const permissionRoles = value + const super_admin = "admin" + + const hasRole = roles.some(role => { + return super_admin === role || permissionRoles.includes(role) + }) + + return hasRole + + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } +} \ No newline at end of file diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js new file mode 100644 index 00000000..8865fcdb --- /dev/null +++ b/frontend/src/utils/request.js @@ -0,0 +1,153 @@ +import axios from 'axios' +import { Notification, MessageBox, Message, Loading } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from "@/utils/roomroot" +import cache from '@/plugins/cache' +import { saveAs } from 'file-saver' + +let downloadLoadingInstance +// 是否显示重新登录 +export let isRelogin = { show: false } + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: process.env.VUE_APP_BASE_API, + // 超时 + timeout: 10000 +}) + +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + // 间隔时间(ms),小于此时间视为重复提交 + const interval = (config.headers || {}).interval || 1000 + if (getToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.params = {} + config.url = url + } + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const requestSize = Object.keys(JSON.stringify(requestObj)).length // 请求数据大小 + const limitSize = 5 * 1024 * 1024 // 限制存放数据5M + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') + return config + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url // 请求地址 + const s_data = sessionObj.data // 请求数据 + const s_time = sessionObj.time // 请求时间 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交' + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + cache.session.setJSON('sessionObj', requestObj) + } + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200 + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true + MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { + isRelogin.show = false + store.dispatch('LogOut').then(() => { + location.href = '/index' + }) + }).catch(() => { + isRelogin.show = false + }) + } + return Promise.reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + Message({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + Message({ message: msg, type: 'warning' }) + return Promise.reject('error') + } else if (code !== 200) { + Notification.error({ title: msg }) + return Promise.reject('error') + } else { + return res.data + } +}, +error => { + console.log('err' + error) + let { message } = error + if (message == "Network Error") { + message = "后端接口连接异常" + } else if (message.includes("timeout")) { + message = "系统接口请求超时" + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.slice(-3) + "异常" + } + Message({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) +} +) + +// 通用下载方法 +export function download(url, params, filename, config) { + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + return service.post(url, params, { + transformRequest: [(params) => { return tansParams(params) }], + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + responseType: 'blob', + ...config + }).then(async (data) => { + const isBlob = blobValidate(data) + if (isBlob) { + const blob = new Blob([data]) + saveAs(blob, filename) + } else { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg) + } + downloadLoadingInstance.close() + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) +} + +export default service diff --git a/frontend/src/utils/roomroot.js b/frontend/src/utils/roomroot.js new file mode 100644 index 00000000..bde9752b --- /dev/null +++ b/frontend/src/utils/roomroot.js @@ -0,0 +1,228 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 roomroot + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '') + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields() + } +} + +// 添加日期范围 +export function addDateRange(params, dateRange, propName) { + let search = params + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0] + search.params['endTime'] = dateRange[1] + } else { + search.params['begin' + propName] = dateRange[0] + search.params['end' + propName] = dateRange[1] + } + return search +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return "" + } + var actions = [] + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label) + return true + } + }) + if (actions.length === 0) { + actions.push(value) + } + return actions.join('') +} + +// 回显数据字典(字符串、数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length === 0) { + return "" + } + if (Array.isArray(value)) { + value = value.join(",") + } + var actions = [] + var currentSeparator = undefined === separator ? "," : separator + var temp = value.split(currentSeparator) + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator) + match = true + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator) + } + }) + return actions.join('').substring(0, actions.join('').length - 1) +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, flag = true, i = 1 + str = str.replace(/%s/g, function () { + var arg = args[i++] + if (typeof arg === 'undefined') { + flag = false + return '' + } + return arg + }) + return flag ? str : '' +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return "" + } + return str +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]) + } else { + source[p] = target[p] + } + } catch (e) { + source[p] = target[p] + } + } + return source +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + } + + var childrenListMap = {} + var tree = [] + for (let d of data) { + let id = d[config.id] + childrenListMap[id] = d + if (!d[config.childrenList]) { + d[config.childrenList] = [] + } + } + + for (let d of data) { + let parentId = d[config.parentId] + let parentObj = childrenListMap[parentId] + if (!parentObj) { + tree.push(d) + } else { + parentObj[config.childrenList].push(d) + } + } + return tree +} + +/** +* 参数处理 +* @param {*} params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} + +// 返回项目路径 +export function getNormalPath(p) { + if (p.length === 0 || !p || p == 'undefined') { + return p + } + let res = p.replace('//', '/') + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1) + } + return res +} + +// 验证是否为blob格式 +export function blobValidate(data) { + return data.type !== 'application/json' +} diff --git a/frontend/src/utils/ruoyi.js b/frontend/src/utils/ruoyi.js new file mode 100644 index 00000000..bde9752b --- /dev/null +++ b/frontend/src/utils/ruoyi.js @@ -0,0 +1,228 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 roomroot + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '') + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields() + } +} + +// 添加日期范围 +export function addDateRange(params, dateRange, propName) { + let search = params + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0] + search.params['endTime'] = dateRange[1] + } else { + search.params['begin' + propName] = dateRange[0] + search.params['end' + propName] = dateRange[1] + } + return search +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return "" + } + var actions = [] + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label) + return true + } + }) + if (actions.length === 0) { + actions.push(value) + } + return actions.join('') +} + +// 回显数据字典(字符串、数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length === 0) { + return "" + } + if (Array.isArray(value)) { + value = value.join(",") + } + var actions = [] + var currentSeparator = undefined === separator ? "," : separator + var temp = value.split(currentSeparator) + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator) + match = true + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator) + } + }) + return actions.join('').substring(0, actions.join('').length - 1) +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, flag = true, i = 1 + str = str.replace(/%s/g, function () { + var arg = args[i++] + if (typeof arg === 'undefined') { + flag = false + return '' + } + return arg + }) + return flag ? str : '' +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return "" + } + return str +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]) + } else { + source[p] = target[p] + } + } catch (e) { + source[p] = target[p] + } + } + return source +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + } + + var childrenListMap = {} + var tree = [] + for (let d of data) { + let id = d[config.id] + childrenListMap[id] = d + if (!d[config.childrenList]) { + d[config.childrenList] = [] + } + } + + for (let d of data) { + let parentId = d[config.parentId] + let parentObj = childrenListMap[parentId] + if (!parentObj) { + tree.push(d) + } else { + parentObj[config.childrenList].push(d) + } + } + return tree +} + +/** +* 参数处理 +* @param {*} params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} + +// 返回项目路径 +export function getNormalPath(p) { + if (p.length === 0 || !p || p == 'undefined') { + return p + } + let res = p.replace('//', '/') + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1) + } + return res +} + +// 验证是否为blob格式 +export function blobValidate(data) { + return data.type !== 'application/json' +} diff --git a/frontend/src/utils/scroll-to.js b/frontend/src/utils/scroll-to.js new file mode 100644 index 00000000..5c2bc449 --- /dev/null +++ b/frontend/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/frontend/src/utils/validate.js b/frontend/src/utils/validate.js new file mode 100644 index 00000000..d3b425bc --- /dev/null +++ b/frontend/src/utils/validate.js @@ -0,0 +1,119 @@ +/** + * 路径匹配器 + * @param {string} pattern + * @param {string} path + * @returns {Boolean} + */ +export function isPathMatch(pattern, path) { + const regexPattern = pattern + .replace(/([.+^${}()|\[\]\\])/g, '\\$1') + .replace(/\*\*/g, '__DOUBLE_STAR__') + .replace(/\*/g, '[^/]*') + .replace(/__DOUBLE_STAR__/g, '.*') + .replace(/\?/g, '[^/]') + const regex = new RegExp(`^${regexPattern}$`) + return regex.test(path) +} + +/** + * 判断value字符串是否为空 + * @param {string} value + * @returns {Boolean} + */ +export function isEmpty(value) { + if (value == null || value == "" || value == undefined || value == "undefined") { + return true + } + return false +} + +/** + * 判断url是否是http或https + * @param {string} url + * @returns {Boolean} + */ +export function isHttp(url) { + return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 +} + +/** + * 判断path是否为外链 + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/** + * @param {string} url + * @returns {Boolean} + */ +export function validURL(url) { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validLowerCase(str) { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUpperCase(str) { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validAlphabets(str) { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/** + * @param {string} email + * @returns {Boolean} + */ +export function validEmail(email) { + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function isString(str) { + return typeof str === 'string' || str instanceof String +} + +/** + * @param {Array} arg + * @returns {Boolean} + */ +export function isArray(arg) { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) +} diff --git a/frontend/src/views/assessment/index.vue b/frontend/src/views/assessment/index.vue new file mode 100644 index 00000000..e1605b9a --- /dev/null +++ b/frontend/src/views/assessment/index.vue @@ -0,0 +1,881 @@ + + + + + diff --git a/frontend/src/views/classHour/jointTraining/index.vue b/frontend/src/views/classHour/jointTraining/index.vue new file mode 100644 index 00000000..f12ff447 --- /dev/null +++ b/frontend/src/views/classHour/jointTraining/index.vue @@ -0,0 +1,419 @@ + + + + + diff --git a/frontend/src/views/classHour/plan/index.vue b/frontend/src/views/classHour/plan/index.vue new file mode 100644 index 00000000..0aba39c4 --- /dev/null +++ b/frontend/src/views/classHour/plan/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/classHour/subsidy/index.vue b/frontend/src/views/classHour/subsidy/index.vue new file mode 100644 index 00000000..80498379 --- /dev/null +++ b/frontend/src/views/classHour/subsidy/index.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/frontend/src/views/dashboard/BarChart.vue b/frontend/src/views/dashboard/BarChart.vue new file mode 100644 index 00000000..ff7fd445 --- /dev/null +++ b/frontend/src/views/dashboard/BarChart.vue @@ -0,0 +1,102 @@ + + + diff --git a/frontend/src/views/dashboard/LineChart.vue b/frontend/src/views/dashboard/LineChart.vue new file mode 100644 index 00000000..bf92302a --- /dev/null +++ b/frontend/src/views/dashboard/LineChart.vue @@ -0,0 +1,135 @@ + + + diff --git a/frontend/src/views/dashboard/PanelGroup.vue b/frontend/src/views/dashboard/PanelGroup.vue new file mode 100644 index 00000000..1cd34c80 --- /dev/null +++ b/frontend/src/views/dashboard/PanelGroup.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/frontend/src/views/dashboard/PieChart.vue b/frontend/src/views/dashboard/PieChart.vue new file mode 100644 index 00000000..084180f7 --- /dev/null +++ b/frontend/src/views/dashboard/PieChart.vue @@ -0,0 +1,79 @@ + + + diff --git a/frontend/src/views/dashboard/RaddarChart.vue b/frontend/src/views/dashboard/RaddarChart.vue new file mode 100644 index 00000000..66e2f8d0 --- /dev/null +++ b/frontend/src/views/dashboard/RaddarChart.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/src/views/dashboard/mixins/resize.js b/frontend/src/views/dashboard/mixins/resize.js new file mode 100644 index 00000000..23c158ff --- /dev/null +++ b/frontend/src/views/dashboard/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/frontend/src/views/error/401.vue b/frontend/src/views/error/401.vue new file mode 100644 index 00000000..bba557b1 --- /dev/null +++ b/frontend/src/views/error/401.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/frontend/src/views/error/404.vue b/frontend/src/views/error/404.vue new file mode 100644 index 00000000..b0addcc8 --- /dev/null +++ b/frontend/src/views/error/404.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/frontend/src/views/index.vue b/frontend/src/views/index.vue new file mode 100644 index 00000000..6c92d2d7 --- /dev/null +++ b/frontend/src/views/index.vue @@ -0,0 +1,534 @@ + + + + + diff --git a/frontend/src/views/lock.vue b/frontend/src/views/lock.vue new file mode 100644 index 00000000..5fbc3326 --- /dev/null +++ b/frontend/src/views/lock.vue @@ -0,0 +1,375 @@ + + + + + diff --git a/frontend/src/views/login.vue b/frontend/src/views/login.vue new file mode 100644 index 00000000..5d92fee6 --- /dev/null +++ b/frontend/src/views/login.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/frontend/src/views/monitor/cache/index.vue b/frontend/src/views/monitor/cache/index.vue new file mode 100644 index 00000000..3e14ecb1 --- /dev/null +++ b/frontend/src/views/monitor/cache/index.vue @@ -0,0 +1,148 @@ + + + diff --git a/frontend/src/views/monitor/cache/list.vue b/frontend/src/views/monitor/cache/list.vue new file mode 100644 index 00000000..fc103240 --- /dev/null +++ b/frontend/src/views/monitor/cache/list.vue @@ -0,0 +1,241 @@ + + + diff --git a/frontend/src/views/monitor/druid/index.vue b/frontend/src/views/monitor/druid/index.vue new file mode 100644 index 00000000..1ccd4b49 --- /dev/null +++ b/frontend/src/views/monitor/druid/index.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/src/views/monitor/job/detail.vue b/frontend/src/views/monitor/job/detail.vue new file mode 100644 index 00000000..0a7dcdb4 --- /dev/null +++ b/frontend/src/views/monitor/job/detail.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/frontend/src/views/monitor/job/index.vue b/frontend/src/views/monitor/job/index.vue new file mode 100644 index 00000000..f6981697 --- /dev/null +++ b/frontend/src/views/monitor/job/index.vue @@ -0,0 +1,508 @@ + + + + + diff --git a/frontend/src/views/monitor/job/log.vue b/frontend/src/views/monitor/job/log.vue new file mode 100644 index 00000000..67f32d0c --- /dev/null +++ b/frontend/src/views/monitor/job/log.vue @@ -0,0 +1,302 @@ + + + + + diff --git a/frontend/src/views/monitor/logininfor/index.vue b/frontend/src/views/monitor/logininfor/index.vue new file mode 100644 index 00000000..d750e9d0 --- /dev/null +++ b/frontend/src/views/monitor/logininfor/index.vue @@ -0,0 +1,274 @@ + + + + + + diff --git a/frontend/src/views/monitor/online/index.vue b/frontend/src/views/monitor/online/index.vue new file mode 100644 index 00000000..f94695e9 --- /dev/null +++ b/frontend/src/views/monitor/online/index.vue @@ -0,0 +1,152 @@ + + + + + + diff --git a/frontend/src/views/monitor/operlog/detail.vue b/frontend/src/views/monitor/operlog/detail.vue new file mode 100644 index 00000000..7bb26a01 --- /dev/null +++ b/frontend/src/views/monitor/operlog/detail.vue @@ -0,0 +1,147 @@ + + + diff --git a/frontend/src/views/monitor/operlog/index.vue b/frontend/src/views/monitor/operlog/index.vue new file mode 100644 index 00000000..8f95dc5b --- /dev/null +++ b/frontend/src/views/monitor/operlog/index.vue @@ -0,0 +1,306 @@ + + + + + diff --git a/frontend/src/views/monitor/server/index.vue b/frontend/src/views/monitor/server/index.vue new file mode 100644 index 00000000..fb429eac --- /dev/null +++ b/frontend/src/views/monitor/server/index.vue @@ -0,0 +1,207 @@ + + + diff --git a/frontend/src/views/redirect.vue b/frontend/src/views/redirect.vue new file mode 100644 index 00000000..dbdaa97f --- /dev/null +++ b/frontend/src/views/redirect.vue @@ -0,0 +1,12 @@ + diff --git a/frontend/src/views/register.vue b/frontend/src/views/register.vue new file mode 100644 index 00000000..8545e1ba --- /dev/null +++ b/frontend/src/views/register.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/frontend/src/views/schedule/planImport/index.vue b/frontend/src/views/schedule/planImport/index.vue new file mode 100644 index 00000000..b022024a --- /dev/null +++ b/frontend/src/views/schedule/planImport/index.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/frontend/src/views/student/score/index.vue b/frontend/src/views/student/score/index.vue new file mode 100644 index 00000000..7eeb355b --- /dev/null +++ b/frontend/src/views/student/score/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/student/shiftTeam/index.vue b/frontend/src/views/student/shiftTeam/index.vue new file mode 100644 index 00000000..f44f4c21 --- /dev/null +++ b/frontend/src/views/student/shiftTeam/index.vue @@ -0,0 +1,772 @@ + + + + + diff --git a/frontend/src/views/student/statusChange/index.vue b/frontend/src/views/student/statusChange/index.vue new file mode 100644 index 00000000..41f64994 --- /dev/null +++ b/frontend/src/views/student/statusChange/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/frontend/src/views/student/studentInfo/index.vue b/frontend/src/views/student/studentInfo/index.vue new file mode 100644 index 00000000..f1ddd51d --- /dev/null +++ b/frontend/src/views/student/studentInfo/index.vue @@ -0,0 +1,597 @@ + + + + + diff --git a/frontend/src/views/student/warningCondition/index.vue b/frontend/src/views/student/warningCondition/index.vue new file mode 100644 index 00000000..d7e56722 --- /dev/null +++ b/frontend/src/views/student/warningCondition/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/student/warningResult/index.vue b/frontend/src/views/student/warningResult/index.vue new file mode 100644 index 00000000..1ae1f8cc --- /dev/null +++ b/frontend/src/views/student/warningResult/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/subjectMajor/discipline/index.vue b/frontend/src/views/subjectMajor/discipline/index.vue new file mode 100644 index 00000000..066fe775 --- /dev/null +++ b/frontend/src/views/subjectMajor/discipline/index.vue @@ -0,0 +1,450 @@ + + + + + diff --git a/frontend/src/views/subjectMajor/major/index.vue b/frontend/src/views/subjectMajor/major/index.vue new file mode 100644 index 00000000..dfb066ae --- /dev/null +++ b/frontend/src/views/subjectMajor/major/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/system/config/index.vue b/frontend/src/views/system/config/index.vue new file mode 100644 index 00000000..f45e291f --- /dev/null +++ b/frontend/src/views/system/config/index.vue @@ -0,0 +1,380 @@ + + + + + diff --git a/frontend/src/views/system/dept/index.vue b/frontend/src/views/system/dept/index.vue new file mode 100644 index 00000000..601e226b --- /dev/null +++ b/frontend/src/views/system/dept/index.vue @@ -0,0 +1,430 @@ + + + + + diff --git a/frontend/src/views/system/dict/data.vue b/frontend/src/views/system/dict/data.vue new file mode 100644 index 00000000..d9448770 --- /dev/null +++ b/frontend/src/views/system/dict/data.vue @@ -0,0 +1,439 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/system/dict/detail.vue b/frontend/src/views/system/dict/detail.vue new file mode 100644 index 00000000..028d151b --- /dev/null +++ b/frontend/src/views/system/dict/detail.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/frontend/src/views/system/dict/index.vue b/frontend/src/views/system/dict/index.vue new file mode 100644 index 00000000..bab1b55d --- /dev/null +++ b/frontend/src/views/system/dict/index.vue @@ -0,0 +1,412 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/system/menu/index.vue b/frontend/src/views/system/menu/index.vue new file mode 100644 index 00000000..49fac46c --- /dev/null +++ b/frontend/src/views/system/menu/index.vue @@ -0,0 +1,571 @@ + + + + + diff --git a/frontend/src/views/system/notice/ReadUsers.vue b/frontend/src/views/system/notice/ReadUsers.vue new file mode 100644 index 00000000..b0e56221 --- /dev/null +++ b/frontend/src/views/system/notice/ReadUsers.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend/src/views/system/notice/index.vue b/frontend/src/views/system/notice/index.vue new file mode 100644 index 00000000..dcd0bab9 --- /dev/null +++ b/frontend/src/views/system/notice/index.vue @@ -0,0 +1,369 @@ + + + + diff --git a/frontend/src/views/system/post/index.vue b/frontend/src/views/system/post/index.vue new file mode 100644 index 00000000..6bdc3a3b --- /dev/null +++ b/frontend/src/views/system/post/index.vue @@ -0,0 +1,346 @@ + + + + diff --git a/frontend/src/views/system/role/authUser.vue b/frontend/src/views/system/role/authUser.vue new file mode 100644 index 00000000..39307039 --- /dev/null +++ b/frontend/src/views/system/role/authUser.vue @@ -0,0 +1,236 @@ + + + + \ No newline at end of file diff --git a/frontend/src/views/system/role/index.vue b/frontend/src/views/system/role/index.vue new file mode 100644 index 00000000..17468da6 --- /dev/null +++ b/frontend/src/views/system/role/index.vue @@ -0,0 +1,642 @@ + + + + \ No newline at end of file diff --git a/frontend/src/views/system/role/selectUser.vue b/frontend/src/views/system/role/selectUser.vue new file mode 100644 index 00000000..64df530e --- /dev/null +++ b/frontend/src/views/system/role/selectUser.vue @@ -0,0 +1,136 @@ + + + diff --git a/frontend/src/views/system/user/authRole.vue b/frontend/src/views/system/user/authRole.vue new file mode 100644 index 00000000..909fe29b --- /dev/null +++ b/frontend/src/views/system/user/authRole.vue @@ -0,0 +1,152 @@ + + + + \ No newline at end of file diff --git a/frontend/src/views/system/user/index.vue b/frontend/src/views/system/user/index.vue new file mode 100644 index 00000000..30bc674c --- /dev/null +++ b/frontend/src/views/system/user/index.vue @@ -0,0 +1,509 @@ + + + + diff --git a/frontend/src/views/system/user/profile/index.vue b/frontend/src/views/system/user/profile/index.vue new file mode 100644 index 00000000..42687a4c --- /dev/null +++ b/frontend/src/views/system/user/profile/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/frontend/src/views/system/user/profile/resetPwd.vue b/frontend/src/views/system/user/profile/resetPwd.vue new file mode 100644 index 00000000..d8d6125d --- /dev/null +++ b/frontend/src/views/system/user/profile/resetPwd.vue @@ -0,0 +1,70 @@ + + + diff --git a/frontend/src/views/system/user/profile/userAvatar.vue b/frontend/src/views/system/user/profile/userAvatar.vue new file mode 100644 index 00000000..718cf541 --- /dev/null +++ b/frontend/src/views/system/user/profile/userAvatar.vue @@ -0,0 +1,184 @@ + + + + diff --git a/frontend/src/views/system/user/profile/userInfo.vue b/frontend/src/views/system/user/profile/userInfo.vue new file mode 100644 index 00000000..350dad4f --- /dev/null +++ b/frontend/src/views/system/user/profile/userInfo.vue @@ -0,0 +1,88 @@ + + + diff --git a/frontend/src/views/system/user/view.vue b/frontend/src/views/system/user/view.vue new file mode 100644 index 00000000..663262e1 --- /dev/null +++ b/frontend/src/views/system/user/view.vue @@ -0,0 +1,177 @@ + + + diff --git a/frontend/src/views/teachBusiness/calendar/components/SchoolCalendarEditor.vue b/frontend/src/views/teachBusiness/calendar/components/SchoolCalendarEditor.vue new file mode 100644 index 00000000..5b1f45f3 --- /dev/null +++ b/frontend/src/views/teachBusiness/calendar/components/SchoolCalendarEditor.vue @@ -0,0 +1,719 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/calendar/index.vue b/frontend/src/views/teachBusiness/calendar/index.vue new file mode 100644 index 00000000..04fe5f17 --- /dev/null +++ b/frontend/src/views/teachBusiness/calendar/index.vue @@ -0,0 +1,509 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/semester/calendar.vue b/frontend/src/views/teachBusiness/semester/calendar.vue new file mode 100644 index 00000000..9d5eb5d2 --- /dev/null +++ b/frontend/src/views/teachBusiness/semester/calendar.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/semester/index.vue b/frontend/src/views/teachBusiness/semester/index.vue new file mode 100644 index 00000000..d13689f2 --- /dev/null +++ b/frontend/src/views/teachBusiness/semester/index.vue @@ -0,0 +1,596 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/syllabus/index.vue b/frontend/src/views/teachBusiness/syllabus/index.vue new file mode 100644 index 00000000..9566df4f --- /dev/null +++ b/frontend/src/views/teachBusiness/syllabus/index.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/teachingTask/index.vue b/frontend/src/views/teachBusiness/teachingTask/index.vue new file mode 100644 index 00000000..192f2dda --- /dev/null +++ b/frontend/src/views/teachBusiness/teachingTask/index.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/timetable/index.vue b/frontend/src/views/teachBusiness/timetable/index.vue new file mode 100644 index 00000000..0f0cd27d --- /dev/null +++ b/frontend/src/views/teachBusiness/timetable/index.vue @@ -0,0 +1,654 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/timetableAdjust/index.vue b/frontend/src/views/teachBusiness/timetableAdjust/index.vue new file mode 100644 index 00000000..f69f15fc --- /dev/null +++ b/frontend/src/views/teachBusiness/timetableAdjust/index.vue @@ -0,0 +1,415 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/teachBusiness/timetableConflict/index.vue b/frontend/src/views/teachBusiness/timetableConflict/index.vue new file mode 100644 index 00000000..92074df5 --- /dev/null +++ b/frontend/src/views/teachBusiness/timetableConflict/index.vue @@ -0,0 +1,314 @@ + + + + + diff --git a/frontend/src/views/teachBusiness/trainingPlan/index.vue b/frontend/src/views/teachBusiness/trainingPlan/index.vue new file mode 100644 index 00000000..30f48e94 --- /dev/null +++ b/frontend/src/views/teachBusiness/trainingPlan/index.vue @@ -0,0 +1,475 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/teachBusiness/venue/index.vue b/frontend/src/views/teachBusiness/venue/index.vue new file mode 100644 index 00000000..f6932722 --- /dev/null +++ b/frontend/src/views/teachBusiness/venue/index.vue @@ -0,0 +1,12 @@ + + + diff --git a/frontend/src/views/teachNotice/index.vue b/frontend/src/views/teachNotice/index.vue new file mode 100644 index 00000000..62f60ada --- /dev/null +++ b/frontend/src/views/teachNotice/index.vue @@ -0,0 +1,458 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/teachOffice/elective/index.vue b/frontend/src/views/teachOffice/elective/index.vue new file mode 100644 index 00000000..aea9a03e --- /dev/null +++ b/frontend/src/views/teachOffice/elective/index.vue @@ -0,0 +1,533 @@ + + + + + diff --git a/frontend/src/views/teachOffice/office/index.vue b/frontend/src/views/teachOffice/office/index.vue new file mode 100644 index 00000000..8f0e76c0 --- /dev/null +++ b/frontend/src/views/teachOffice/office/index.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/frontend/src/views/teachOffice/shiftSemester/ClassCalendarDialog.vue b/frontend/src/views/teachOffice/shiftSemester/ClassCalendarDialog.vue new file mode 100644 index 00000000..8ebe16d8 --- /dev/null +++ b/frontend/src/views/teachOffice/shiftSemester/ClassCalendarDialog.vue @@ -0,0 +1,906 @@ + + + + + diff --git a/frontend/src/views/teachOffice/shiftSemester/ClassSemesterDetailDialog.vue b/frontend/src/views/teachOffice/shiftSemester/ClassSemesterDetailDialog.vue new file mode 100644 index 00000000..b6633a11 --- /dev/null +++ b/frontend/src/views/teachOffice/shiftSemester/ClassSemesterDetailDialog.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/frontend/src/views/teachOffice/shiftSemester/ClassTeamSelectDialog.vue b/frontend/src/views/teachOffice/shiftSemester/ClassTeamSelectDialog.vue new file mode 100644 index 00000000..ae8ef8cc --- /dev/null +++ b/frontend/src/views/teachOffice/shiftSemester/ClassTeamSelectDialog.vue @@ -0,0 +1,439 @@ + + + + + diff --git a/frontend/src/views/teachOffice/shiftSemester/PeidangEditDialog.vue b/frontend/src/views/teachOffice/shiftSemester/PeidangEditDialog.vue new file mode 100644 index 00000000..e2d95009 --- /dev/null +++ b/frontend/src/views/teachOffice/shiftSemester/PeidangEditDialog.vue @@ -0,0 +1,706 @@ + + + + + diff --git a/frontend/src/views/teachOffice/shiftSemester/index.vue b/frontend/src/views/teachOffice/shiftSemester/index.vue new file mode 100644 index 00000000..4b60e5ab --- /dev/null +++ b/frontend/src/views/teachOffice/shiftSemester/index.vue @@ -0,0 +1,486 @@ + + + + + diff --git a/frontend/src/views/teachOffice/subject/index.vue b/frontend/src/views/teachOffice/subject/index.vue new file mode 100644 index 00000000..6fd702ca --- /dev/null +++ b/frontend/src/views/teachOffice/subject/index.vue @@ -0,0 +1,875 @@ + + + + + diff --git a/frontend/src/views/teachOffice/taskPlan/index.vue b/frontend/src/views/teachOffice/taskPlan/index.vue new file mode 100644 index 00000000..498aa412 --- /dev/null +++ b/frontend/src/views/teachOffice/taskPlan/index.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/frontend/src/views/teachOffice/teacher/index.vue b/frontend/src/views/teachOffice/teacher/index.vue new file mode 100644 index 00000000..da9d5842 --- /dev/null +++ b/frontend/src/views/teachOffice/teacher/index.vue @@ -0,0 +1,824 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/teachingLog/organLog/index.vue b/frontend/src/views/teachingLog/organLog/index.vue new file mode 100644 index 00000000..01cf2fa7 --- /dev/null +++ b/frontend/src/views/teachingLog/organLog/index.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/textbook/index.vue b/frontend/src/views/textbook/index.vue new file mode 100644 index 00000000..2694c00f --- /dev/null +++ b/frontend/src/views/textbook/index.vue @@ -0,0 +1,805 @@ + + + + + diff --git a/frontend/src/views/tool/build/CodeTypeDialog.vue b/frontend/src/views/tool/build/CodeTypeDialog.vue new file mode 100644 index 00000000..1b8207d3 --- /dev/null +++ b/frontend/src/views/tool/build/CodeTypeDialog.vue @@ -0,0 +1,106 @@ + + diff --git a/frontend/src/views/tool/build/DraggableItem.vue b/frontend/src/views/tool/build/DraggableItem.vue new file mode 100644 index 00000000..6eb960e0 --- /dev/null +++ b/frontend/src/views/tool/build/DraggableItem.vue @@ -0,0 +1,100 @@ + diff --git a/frontend/src/views/tool/build/IconsDialog.vue b/frontend/src/views/tool/build/IconsDialog.vue new file mode 100644 index 00000000..84dd9207 --- /dev/null +++ b/frontend/src/views/tool/build/IconsDialog.vue @@ -0,0 +1,123 @@ + + + diff --git a/frontend/src/views/tool/build/RightPanel.vue b/frontend/src/views/tool/build/RightPanel.vue new file mode 100644 index 00000000..01e755c7 --- /dev/null +++ b/frontend/src/views/tool/build/RightPanel.vue @@ -0,0 +1,944 @@ + + + + + diff --git a/frontend/src/views/tool/build/TreeNodeDialog.vue b/frontend/src/views/tool/build/TreeNodeDialog.vue new file mode 100644 index 00000000..61b19b93 --- /dev/null +++ b/frontend/src/views/tool/build/TreeNodeDialog.vue @@ -0,0 +1,148 @@ + + diff --git a/frontend/src/views/tool/build/index.vue b/frontend/src/views/tool/build/index.vue new file mode 100644 index 00000000..42a739c2 --- /dev/null +++ b/frontend/src/views/tool/build/index.vue @@ -0,0 +1,775 @@ + + + + + diff --git a/frontend/src/views/tool/gen/basicInfoForm.vue b/frontend/src/views/tool/gen/basicInfoForm.vue new file mode 100644 index 00000000..0d55f9e6 --- /dev/null +++ b/frontend/src/views/tool/gen/basicInfoForm.vue @@ -0,0 +1,60 @@ + + + diff --git a/frontend/src/views/tool/gen/createTable.vue b/frontend/src/views/tool/gen/createTable.vue new file mode 100644 index 00000000..eedb09fb --- /dev/null +++ b/frontend/src/views/tool/gen/createTable.vue @@ -0,0 +1,45 @@ + + + diff --git a/frontend/src/views/tool/gen/editTable.vue b/frontend/src/views/tool/gen/editTable.vue new file mode 100644 index 00000000..e6b12a8e --- /dev/null +++ b/frontend/src/views/tool/gen/editTable.vue @@ -0,0 +1,230 @@ + + + diff --git a/frontend/src/views/tool/gen/genInfoForm.vue b/frontend/src/views/tool/gen/genInfoForm.vue new file mode 100644 index 00000000..398bf30d --- /dev/null +++ b/frontend/src/views/tool/gen/genInfoForm.vue @@ -0,0 +1,336 @@ + + + diff --git a/frontend/src/views/tool/gen/importTable.vue b/frontend/src/views/tool/gen/importTable.vue new file mode 100644 index 00000000..855f63a1 --- /dev/null +++ b/frontend/src/views/tool/gen/importTable.vue @@ -0,0 +1,120 @@ + + + diff --git a/frontend/src/views/tool/gen/index.vue b/frontend/src/views/tool/gen/index.vue new file mode 100644 index 00000000..d4d4733f --- /dev/null +++ b/frontend/src/views/tool/gen/index.vue @@ -0,0 +1,386 @@ + + + + + diff --git a/frontend/src/views/tool/swagger/index.vue b/frontend/src/views/tool/swagger/index.vue new file mode 100644 index 00000000..bf1e8f72 --- /dev/null +++ b/frontend/src/views/tool/swagger/index.vue @@ -0,0 +1,15 @@ + + diff --git a/frontend/vue.config.js b/frontend/vue.config.js new file mode 100644 index 00000000..32cb96b5 --- /dev/null +++ b/frontend/vue.config.js @@ -0,0 +1,136 @@ +'use strict' +const path = require('path') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const CompressionPlugin = require('compression-webpack-plugin') + +const name = process.env.VUE_APP_TITLE || '教学管理信息系统' // 网页标题 + +const baseUrl = 'http://10.1.1.157:8080' // 后端接口 + +const port = 80 // 固定开发服务器端口,避免多实例端口混乱 + +// vue.config.js 配置说明 +//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions +// 这里只列一部分,具体配置参考文档 +module.exports = { + // 部署生产环境和开发环境下的URL。 + // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 + // 例如 https://www.roomroot.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.roomroot.vip/admin/,则设置 baseUrl 为 /admin/。 + publicPath: process.env.NODE_ENV === "production" ? "/" : "/", + // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) + outputDir: 'dist', + // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) + assetsDir: 'static', + // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 + productionSourceMap: false, + transpileDependencies: ['quill'], + // webpack-dev-server 相关配置 + devServer: { + host: '0.0.0.0', + port: port, + open: true, + proxy: { + // detail: https://cli.vuejs.org/config/#devserver-proxy + [process.env.VUE_APP_BASE_API]: { + target: baseUrl, + changeOrigin: true, + pathRewrite: { + ['^/api']: '/api' + } + }, + // springdoc proxy + '^/v3/api-docs/(.*)': { + target: baseUrl, + changeOrigin: true + } + }, + disableHostCheck: true + }, + css: { + loaderOptions: { + sass: { + sassOptions: { outputStyle: "expanded" } + } + } + }, + configureWebpack: { + name: name, + resolve: { + alias: { + '@': resolve('src') + } + }, + plugins: [ + // http://doc.roomroot.vip/roomroot-vue/other/faq.html#使用gzip解压缩静态文件 + new CompressionPlugin({ + cache: false, // 不启用文件缓存 + test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式 + filename: '[path][base].gz[query]', // 压缩后的文件名 + algorithm: 'gzip', // 使用gzip压缩 + minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩 + deleteOriginalAssets: false // 压缩后删除原文件 + }) + ], + }, + chainWebpack(config) { + config.plugins.delete('preload') // TODO: need test + config.plugins.delete('prefetch') // TODO: need test + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/assets/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/assets/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + config.when(process.env.NODE_ENV !== 'development', config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + + config.optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm + priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + config.optimization.runtimeChunk('single') + }) + } +} diff --git a/reasonix.toml b/reasonix.toml new file mode 100644 index 00000000..b9fbff1d --- /dev/null +++ b/reasonix.toml @@ -0,0 +1,2 @@ +[permissions] +allow = ["Bash=cd /d \"D:\\IDE-WorkSpace\\New-JW\" && dir", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && find backend -path \"*target*\" -prune -o -type f -name \"*.java\" -print | xargs grep -l \"FacultyService\\|class JYSB\\|interface JYSB\" 2>/dev/null", "Edit", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn -q -o compile -DskipTests 2>&1 | tail -40", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn -q compile -DskipTests 2>&1 | tail -50", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn compile -DskipTests -o 2>&1 | tail -15", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn compile -DskipTests -o 2>&1 | tail -6", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && find backend -path \"*target*\" -prune -o -name \"*.java\" -print | xargs grep -ln \"验证码\\|Captcha\\|captcha\\|kaptcha\" 2>/dev/null", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn compile -DskipTests -o 2>&1 | tail -20", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn compile -DskipTests -o 2>&1 | tail -16", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && for f in backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/utils/ExcelParseUtil.java backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/FacultyService.java backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/FacultyServiceImpl.java; do echo \"===== $f =====\"; git diff -- \"$f\" | grep -E \"^\\+|^-\" | grep -v \"^+++\\|^---\" | head -50; done", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && find backend -path \"*target*\" -prune -o -name \"JYBMapper.java\" -print; echo \"---XML---\"; find backend -path \"*target*\" -prune -o -name \"*JYB*.xml\" -print; echo \"---其它JYB xml---\"; find backend -path \"*target*\" -prune -o -name \"*.xml\" -print | xargs grep -ln \"selectTeacherPageList\" 2>/dev/null", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '95,130p' roomroot-admin/src/main/resources/application.yml; echo \"===mybatis-config===\"; cat roomroot-admin/src/main/resources/mybatis/mybatis-config.xml; echo \"===MapperScan===\"; grep -rn \"MapperScan\\|@Mapper\" roomroot-admin/src/main roomroot-jwgl/src/main --include=*.java | grep -i \"mapperscan\\|import.*Mapper\" | head", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===roomroot-jwgl/pom.xml 全文===\"; cat roomroot-jwgl/pom.xml; echo \"===父pom build 段落===\"; sed -n '//,/<\\/build>/p' pom.xml", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===其他模块 src 下 xml 位置===\"; for m in roomroot-common roomroot-system roomroot-framework roomroot-quartz roomroot-generator; do echo \"--- $m ---\"; find $m/src -name \"*.xml\" 2>/dev/null | sed \"s|$m/src/||\" | sort | head -8; done", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn clean package -Dmaven.test.skip=true 2>&1 | tail -30", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===roomroot-jwgl/target/classes 下 xml 数量===\"; find roomroot-jwgl/target/classes -name \"*.xml\" | wc -l; echo \"===JYBMapper.xml 是否存在===\"; find roomroot-jwgl/target/classes -name \"JYBMapper.xml\"; echo \"===jar 内 BOOT-INF/classes 是否含 com/roomroot 下 mapper xml(抽查)===\"; unzip -l roomroot-admin/target/roomroot-admin.jar | grep -E \"com/roomroot/jwgl/mapper/JYBMapper.xml|com/roomroot/jwgl/mapper/JYSBMapper.xml\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===jar 是否包含 JYBMapper.xml===\"; unzip -l roomroot-admin/target/roomroot-admin.jar 2>/dev/null | grep -c \"mapper/JYBMapper.xml\"; echo \"===jar 内所有 mapper xml 计数===\"; unzip -l roomroot-admin/target/roomroot-admin.jar 2>/dev/null | grep -c \"com/roomroot/jwgl/mapper/.*\\.xml\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===roomroot-jwgl.jar 是否存在===\"; ls -la roomroot-jwgl/target/*.jar 2>/dev/null; echo \"===roomroot-jwgl.jar 内 mapper xml 计数===\"; unzip -l roomroot-jwgl/target/roomroot-jwgl.jar 2>/dev/null | grep -c \"com/roomroot/jwgl/mapper/.*\\.xml\"; echo \"===抽查 JYBMapper.xml / JYSBMapper.xml===\"; unzip -l roomroot-jwgl/target/roomroot-jwgl.jar 2>/dev/null | grep -E \"JYBMapper.xml|JYSBMapper.xml\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-jwgl/target\" && unzip -l roomroot-jwgl-3.9.2.jar | grep -c \"\\.xml\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-jwgl/target\" && unzip -l roomroot-jwgl-3.9.2.jar | grep \"JYBMapper.xml\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-admin/target\" && unzip -l roomroot-admin.jar | grep \"roomroot-jwgl\"", "Bash=which java 2>/dev/null && java -version 2>&1 | head -2", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-admin/target\" && java -jar roomroot-admin.jar > /tmp/app_run.log 2>&1", "Bash=sleep 40 && echo \"waited\"", "kill_shell", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && head -25 roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/courserunning/StudentLeaveDetailVO.java; echo \"===115-130===\"; sed -n '113,130p' roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/courserunning/StudentLeaveDetailVO.java; echo \"===编译产物是否含该类===\"; ls roomroot-jwgl/target/classes/com/roomroot/jwgl/vo/courserunning/ | grep -i leave", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn clean package -Dmaven.test.skip=true 2>&1 | tail -16", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-admin/target\" && java -jar roomroot-admin.jar > /tmp/app_run2.log 2>&1", "Bash=sleep 45 && echo waited", "Bash=curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" http://localhost:8080/jys/teacher/list?pageNum=1\\&pageSize=5 2>/dev/null; echo \"---带参数尝试---\"; curl -s \"http://localhost:8080/jys/teacher/list\" 2>/dev/null | head -c 500", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"===roomroot-jwgl.jar 内 XYJXQJBMapper.xml 是否含修正后的类型名===\"; unzip -p roomroot-jwgl/target/roomroot-jwgl-3.9.2.jar com/roomroot/jwgl/mapper/XYJXQJBMapper.xml 2>/dev/null | grep -n \"LeaveLessonVO\\|courserunning.vo.com\"; echo \"===编译产物时间戳===\"; ls -la roomroot-jwgl/target/roomroot-jwgl-3.9.2.jar roomroot-admin/target/roomroot-admin.jar", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '650,760p' roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/AccountManagementServiceImpl.java", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '760,900p' roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/AccountManagementServiceImpl.java", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && git rm backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/LoginController.java backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/login/LoginDTO.java backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/login/LoginResultVO.java", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn clean package -Dmaven.test.skip=true 2>&1 | tail -20", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-admin/target\" && java -jar roomroot-admin.jar > /tmp/app_run3.log 2>&1", "Bash=sleep 40 && echo waited", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend/roomroot-admin/target\" && echo \"=== /auth/login (应404,已删) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" -X POST http://localhost:8080/auth/login -H \"Content-Type: application/json\" -d '{}'; echo \"=== /account-management/role-types (应200,保留) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" http://localhost:8080/account-management/role-types; echo \"=== /system/user/list 无token (应401) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" http://localhost:8080/system/user/list", "Bash=curl -s -o /dev/null -w \"root HTTP %{http_code}\\n\" http://localhost:8080/; echo \"=== 端口 ===\"; grep -n \"Tomcat started\\|http-nio\\|context path\\|server.servlet\" /tmp/app_run3.log 2>/dev/null | head; echo \"=== 日志中是否有 /auth 或 /account-management 或 /system/user 的 mapping 报错 ===\"; grep -niE \"auth|account-management|system/user\" /tmp/app_run3.log 2>/dev/null | head", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && grep -rn \"context-path\\|contextPath\\|servlet:\" roomroot-admin/src/main/resources/application.yml roomroot-admin/src/main/resources/application-druid.yml 2>/dev/null; echo \"=== server 段落 ===\"; sed -n '1,40p' roomroot-admin/src/main/resources/application.yml", "Bash=echo \"=== /api/auth/login (应404,已删) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" -X POST http://localhost:8080/api/auth/login -H \"Content-Type: application/json\" -d '{}'; echo \"=== /api/system/user/list 无token (应401) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" http://localhost:8080/api/system/user/list; echo \"=== /api/account-management/role-types (应200或鉴权) ===\"; curl -s -o /dev/null -w \"HTTP %{http_code}\\n\" http://localhost:8080/api/account-management/role-types", "Bash=echo \"=== /api/auth/login body ===\"; curl -s -X POST http://localhost:8080/api/auth/login -H \"Content-Type: application/json\" -d '{}'; echo; echo \"=== /api/system/user/list body ===\"; curl -s http://localhost:8080/api/system/user/list; echo; echo \"=== 确认当前监听8080进程 ===\"; netstat -ano 2>/dev/null | grep \":8080\" | head -3", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"=== fat jar 中是否含已删类 ===\"; unzip -l roomroot-admin/target/roomroot-admin.jar | grep -iE \"LoginController|LoginDTO|LoginResultVO\" || echo \"(均不存在 → 已彻底移除)\"; echo \"=== roomroot-jwgl.jar 中是否含已删类 ===\"; unzip -l roomroot-jwgl/target/roomroot-jwgl-3.9.2.jar | grep -iE \"LoginController|LoginDTO|LoginResultVO\" || echo \"(均不存在 → 已彻底移除)\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '50,60p' roomroot-system/src/main/resources/mapper/system/SysUserMapper.xml; echo \"=== LoginBody ===\"; sed -n '1,60p' roomroot-common/src/main/java/com/roomroot/common/core/domain/model/LoginBody.java 2>/dev/null | grep -n \"userName\\|trim\\|toLowerCase\"", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && find . -path \"*core/domain/model/LoginBody.java\" -not -path \"*/target/*\"; echo \"===\"; cat $(find . -path \"*core/domain/model/LoginBody.java\" -not -path \"*/target/*\" | head -1) 2>/dev/null", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '1,90p' roomroot-admin/src/main/resources/application-druid.yml", "Bash=cd \"D:/IDE-WorkSpace/New-JW\" && echo \"=== 项目内 sql 文件 ===\"; find . -path \"*/target/*\" -prune -o -name \"*.sql\" -print 2>/dev/null | head -20; echo \"=== 含 sys_user 或 admin 初始化的 sql ===\"; find . -path \"*/target/*\" -prune -o -name \"*.sql\" -print -exec grep -il \"sys_user\\|insert.*admin\\|values.*admin\" {} \\; 2>/dev/null | head", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && sed -n '1,60p' roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/StudentRecordsService.java", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && find roomroot-jwgl/src/main -name \"XYXX.java\"; echo \"===\"; cat $(find roomroot-jwgl/src/main -name \"XYXX.java\" | head -1)", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn -q compile -DskipTests -o 2>&1 | tail -25", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && mvn compile -DskipTests -o 2>&1 | tail -8", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && echo \"=== BaseEntity ===\"; find roomroot-jwgl/src/main -name \"BaseEntity.java\"; cat $(find roomroot-jwgl/src/main -name \"BaseEntity.java\" | head -1); echo \"=== XYXJYJTJB.xml ===\"; cat roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXJYJTJBMapper.xml 2>/dev/null | head -40", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && find roomroot-jwgl/src/main -iname \"*XYXJYJJGB*\" -o -iname \"*XYXJYDSQB*\"; echo \"=== XYXJYJJGB 内容(若为实体) ===\"; sed -n '1,60p' roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/XYXJYJJGB.java 2>/dev/null", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && for m in roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/*.java; do\n name=$(basename \"$m\" .java)\n # 在非 mapper-java 的源码里搜索该 Mapper 类型的引用(import 或直接使用)\n cnt=$(grep -rl \"\\b${name}\\b\" roomroot-jwgl/src/main/java roomroot-admin/src/main/java 2>/dev/null | grep -v \"/mapper/${name}.java\" | wc -l)\n if [ \"$cnt\" -eq 0 ]; then echo \"无引用: $name\"; fi\ndone", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && for m in roomroot-system/src/main/java/com/roomroot/system/mapper/*.java roomroot-framework roomroot-quartz/src/main/java/com/roomroot/quartz/mapper/*.java roomroot-generator/src/main/java/com/roomroot/generator/mapper/*.java roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/*.java 2>/dev/null; do\n [ -f \"$m\" ] || continue\n name=$(basename \"$m\" .java)\n cnt=$(grep -rl \"\\b${name}\\b\" roomroot-jwgl/src/main/java roomroot-admin/src/main/java roomroot-system/src/main/java roomroot-framework/src/main/java roomroot-quartz/src/main/java roomroot-generator/src/main/java 2>/dev/null | grep -v \"/${name}.java\" | wc -l)\n if [ \"$cnt\" -eq 0 ]; then echo \"无引用: ${m}\"; fi\ndone 2>/dev/null | sort -u", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && find roomroot-system/src/main/java roomroot-quartz/src/main/java roomroot-generator/src/main/java roomroot-jwgl/src/main/java roomroot-framework/src/main/java roomroot-common/src/main/java -name \"*Mapper.java\" 2>/dev/null | while read m; do\n name=$(basename \"$m\" .java)\n cnt=$(grep -rl \"\\b${name}\\b\" roomroot-jwgl/src/main/java roomroot-admin/src/main/java roomroot-system/src/main/java roomroot-framework/src/main/java roomroot-quartz/src/main/java roomroot-generator/src/main/java 2>/dev/null | grep -v \"/${name}.java\" | wc -l)\n if [ \"$cnt\" -eq 0 ]; then echo \"无引用: $name ($m)\"; fi\ndone", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && for x in $(find roomroot-jwgl/src/main roomroot-system/src/main roomroot-quartz/src/main roomroot-generator/src/main -name \"*Mapper.xml\" 2>/dev/null); do\n ns=$(grep -m1 \"namespace=\" \"$x\" | sed -n 's/.*namespace=\"\\([^\"]*\\)\".*/\\1/p')\n iface=$(echo \"$ns\" | sed 's/\\./\\//g').java\n if ! find . -path \"*${iface}\" -o -path \"*$(basename \"$iface\")\" | grep -v target | grep -q \"mapper\"; then\n echo \"XML 无对应接口: $x (ns=$ns)\"\n fi\ndone", "Bash=cd \"D:/IDE-WorkSpace/New-JW/backend\" && for base in FZQZBZMapper FZQZBZQZGZMapper FZZHGZBZCPJGYSMapper JCSJBMapper JSZWMapper KTJXFFMapper; do\n echo \"=== $base ===\"\n grep -rln \"interface ${base}\" --include=*.java . 2>/dev/null | grep -v target\n grep -rln \"\\b${base}\\b\" --include=*.java roomroot-jwgl/src/main 2>/dev/null | grep -v target | grep -i \"service\\|controller\" | head -2\ndone"]