From 0d19b65e464db15bf3cd5722bfe1f702d09c622c Mon Sep 17 00:00:00 2001 From: charlesxie <408737515@qq.com> Date: Fri, 4 Aug 2023 16:05:47 +0800 Subject: [PATCH] =?UTF-8?q?feature=EF=BC=9A=E6=96=B0=E5=A2=9E=E6=95=B4?= =?UTF-8?q?=E7=90=86=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/task/serialziers.py | 8 +++ applications/task/services/scan_utils.py | 29 ++++++-- applications/task/tasks.py | 43 ++++++++++- applications/task/views.py | 33 ++++++++- django_vue_cli/settings.py | 8 +-- static/dist/css/app.css | 2 +- static/dist/index.prod.html | 2 +- static/dist/js/app.f642b95eddd98320a0c9.js | 1 + static/dist/js/app.fec4fc7ab40038232872.js | 1 - web/src/api/apiUrl/task/task.js | 3 + web/src/main.js | 2 +- web/src/views/home/home.vue | 83 ++++++++++++++++++++++ web/src/views/user/login.vue | 2 +- 13 files changed, 198 insertions(+), 19 deletions(-) create mode 100644 static/dist/js/app.f642b95eddd98320a0c9.js delete mode 100644 static/dist/js/app.fec4fc7ab40038232872.js diff --git a/applications/task/serialziers.py b/applications/task/serialziers.py index 6c081c6..a330eaa 100644 --- a/applications/task/serialziers.py +++ b/applications/task/serialziers.py @@ -50,3 +50,11 @@ class FetchLlyricSerializer(serializers.Serializer): class TranslationLycSerializer(serializers.Serializer): lyc = serializers.CharField(required=True) + + +class TidyFolderSerializer(serializers.Serializer): + root_path = serializers.CharField(required=True) + first_dir = serializers.CharField(required=True) + second_dir = serializers.CharField(required=False, allow_null=True, allow_blank=True) + file_full_path = serializers.JSONField(required=True) + select_data = serializers.JSONField(required=True) \ No newline at end of file diff --git a/applications/task/services/scan_utils.py b/applications/task/services/scan_utils.py index 364d841..bccf8df 100644 --- a/applications/task/services/scan_utils.py +++ b/applications/task/services/scan_utils.py @@ -14,12 +14,16 @@ from PIL import Image class MusicInfo: - def __init__(self, folder: Folder): - self.file = music_tag.load_file(folder.path) - self.path = folder.path - self.folder_name = folder.name - self.file_type = folder.file_type - self.parent_id = folder.parent_id + def __init__(self, folder): + if isinstance(folder, Folder): + self.file = music_tag.load_file(folder.path) + self.path = folder.path + self.folder_name = folder.name + self.file_type = folder.file_type + self.parent_id = folder.parent_id + else: + self.file = music_tag.load_file(folder) + self.path = folder @property def album_name(self): @@ -29,10 +33,23 @@ class MusicInfo: album_name = "未知专辑" return self.file["album"].value + @property + def album(self): + album_name = self.file["album"].value + album_name = album_name.replace(" ", "") + if not album_name: + album_name = "未知专辑" + return album_name + return self.file["album"].value + @property def artist_name(self): return self.file["artist"].value + @property + def artist(self): + return self.file["artist"].value + @property def year(self): try: diff --git a/applications/task/tasks.py b/applications/task/tasks.py index f425729..e66a15f 100644 --- a/applications/task/tasks.py +++ b/applications/task/tasks.py @@ -1,8 +1,11 @@ import datetime import os +import shutil import time import uuid +from collections import defaultdict +import music_tag from django.conf import settings from django.db import transaction @@ -10,7 +13,7 @@ from applications.music.models import Folder, Track, Album, Genre, Artist, Attac from applications.subsonic.constants import AUDIO_EXTENSIONS_AND_MIMETYPE, COVER_TYPE from applications.task.models import TaskRecord, Task from applications.task.services.music_resource import MusicResource -from applications.task.services.scan_utils import ScanMusic +from applications.task.services.scan_utils import ScanMusic, MusicInfo from applications.task.utils import folder_update_time, exists_dir, match_song from django_vue_cli.celery_app import app @@ -245,7 +248,7 @@ def batch_auto_tag_task(batch, source_list, select_mode): folder_list = TaskRecord.objects.filter(batch=batch, icon="icon-folder").all() for folder in folder_list: data = os.scandir(folder.full_path) - allow_type = ["flac", "mp3", "ape", "wav", "aiff", "wv", "tta", "m4a", "ogg", "mpc", + allow_type = ["flac", "mp3", "ape", "wav", "aiff", "wv", "tta", "m4a", "ogg", "mpc", "opus", "wma", "dsf", "dff"] bulk_set = [] for entry in data: @@ -287,3 +290,39 @@ def batch_auto_tag_task(batch, source_list, select_mode): "parent_path": parent_path, "filename": os.path.basename(task.full_path) }) + + +def tidy_folder_task(music_path_list, tidy_config): + root_path = tidy_config.get("root_path") + first_dir = tidy_config.get("first_dir") + second_dir = tidy_config.get("second_dir") + + if second_dir: + tidy_map = defaultdict(lambda: defaultdict(list)) + for music_path in music_path_list: + file = MusicInfo(music_path) + first_value = getattr(file, first_dir, "未知") + second_value = getattr(file, second_dir, "未知") + tidy_map[first_value][second_value].append(music_path) + for first_value, second_map in tidy_map.items(): + first_path = os.path.join(root_path, first_value) + if not os.path.exists(first_path): + os.makedirs(first_path) + for second_value, music_path_list in second_map.items(): + second_path = os.path.join(first_path, second_value) + if not os.path.exists(second_path): + os.makedirs(second_path) + for music_path in music_path_list: + shutil.move(music_path, second_path) + else: + tidy_map = defaultdict(list) + for music_path in music_path_list: + file = MusicInfo(music_path) + first_value = getattr(file, first_dir, "未知") + tidy_map[first_value].append(music_path) + for first_value, music_path_list in tidy_map.items(): + first_path = os.path.join(root_path, first_value) + if not os.path.exists(first_path): + os.makedirs(first_path) + for music_path in music_path_list: + shutil.move(music_path, first_path) diff --git a/applications/task/views.py b/applications/task/views.py index 005a01e..d4864f6 100644 --- a/applications/task/views.py +++ b/applications/task/views.py @@ -10,10 +10,11 @@ from rest_framework.decorators import action from applications.task.models import TaskRecord, Task from applications.task.serialziers import FileListSerializer, Id3Serializer, UpdateId3Serializer, \ - FetchId3ByTitleSerializer, FetchLlyricSerializer, BatchUpdateId3Serializer, TranslationLycSerializer + FetchId3ByTitleSerializer, FetchLlyricSerializer, BatchUpdateId3Serializer, TranslationLycSerializer, \ + TidyFolderSerializer from applications.task.services.music_resource import MusicResource from applications.task.services.update_ids import update_music_info -from applications.task.tasks import full_scan_folder, scan, clear_music, batch_auto_tag_task +from applications.task.tasks import full_scan_folder, scan, clear_music, batch_auto_tag_task, tidy_folder_task from applications.utils.translation import translation_lyc_text from component.drf.viewsets import GenericViewSet from django_vue_cli.celery_app import app as celery_app @@ -36,6 +37,8 @@ class TaskViewSets(GenericViewSet): return BatchUpdateId3Serializer elif self.action == "translation_lyc": return TranslationLycSerializer + elif self.action == "tidy_folder": + return TidyFolderSerializer return FileListSerializer @action(methods=['POST'], detail=False) @@ -259,6 +262,32 @@ class TaskViewSets(GenericViewSet): new_lyc.append(f"{raw_src}\n「{result}」\n") return self.success_response(data="\n".join(new_lyc)) + @action(methods=['POST'], detail=False) + def tidy_folder(self, request, *args, **kwargs): + validate_data = self.is_validated_data(request.data) + root_path = validate_data["root_path"] + first_dir = validate_data["first_dir"] + full_path = validate_data["file_full_path"] + select_data = validate_data["select_data"] + second_dir = validate_data.get("second_dir", "") + music_id3_info = [] + for data in select_data: + if data.get('icon') == 'icon-folder': + file_full_path = f"{full_path}/{data.get('name')}" + data = os.scandir(file_full_path) + allow_type = ["flac", "mp3", "ape", "wav", "aiff", "wv", "tta", "m4a", "ogg", "mpc", + "opus", "wma", "dsf", "dff"] + for index, entry in enumerate(data, 1): + each = entry.name + file_type = each.split(".")[-1] + if file_type not in allow_type: + continue + music_id3_info.append(f"{file_full_path}/{each}") + else: + music_id3_info.append(f"{full_path}/{data.get('name')}") + tidy_folder_task(music_id3_info, {"root_path": root_path, "first_dir": first_dir, "second_dir": second_dir}) + return self.success_response() + @action(methods=["get"], detail=False) def clear_celery(self, request, *args, **kwargs): active_tasks = celery_app.control.inspect().active() diff --git a/django_vue_cli/settings.py b/django_vue_cli/settings.py index 9d15dc7..bad3f3c 100644 --- a/django_vue_cli/settings.py +++ b/django_vue_cli/settings.py @@ -156,12 +156,12 @@ REST_FRAMEWORK = { JWT_AUTH = { # 过期时间,生成的took七天之后不能使用 - 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), + 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), # 刷新时间 之后的token时间值 - # 'JWT_ALLOW_REFRESH': True, - 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1), + 'JWT_ALLOW_REFRESH': True, + 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), # 请求头携带的参数 - 'JWT_AUTH_HEADER_PREFIX': 'JWT', + 'JWT_AUTH_HEADER_PREFIX': 'JWT' } BASE_URL = "https://music.163.com/" REVERSE_PROXY_TYPE = "nginx" diff --git a/static/dist/css/app.css b/static/dist/css/app.css index 23564d8..e841f7f 100644 --- a/static/dist/css/app.css +++ b/static/dist/css/app.css @@ -1 +1 @@ -body,html{height:100%;min-width:1280px}::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,0,0,.4)}::-webkit-scrollbar{width:6px;height:8px;background-color:hsla(0,0%,100%,.07)}::-webkit-scrollbar-thumb{border-radius:10px;background:rgba(11,54,106,.52);-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.5)}::-webkit-scrollbar-thumb:window-inactive{background-color:hsla(0,0%,100%,.07)}.pm-title{margin-left:10px}.pm-title .pm-title-block{width:20px;height:22px;margin-top:2px;float:left}.pm-title .ivu-icon-md-settings{font-size:22px;color:#1facdd}.pm-top{border:1px solid #e3e3e3;background-color:#fff;height:80px}.pm-top>div>button,.pm-top>div>div,.pm-top>div>span{vertical-align:middle}.base{position:absolute;width:98%;left:1%;top:42px;padding:10px;z-index:9;border:1px solid #e3e3e3;font-size:0;text-align:center}.base .base_box{display:inline-block;padding-right:30px;vertical-align:top}.base .base_box>span{display:inline-block;font-size:12px;float:left;line-height:32px;height:64px;overflow:auto}.monitor-logo-icon[data-v-15b4569c],.monitor-logo[data-v-15b4569c]{width:32px;height:32px}.bk-wrapper .bk-navigation-wrapper .navigation-container{max-width:100%!important}.bk-wrapper .bk-navigation-wrapper .navigation-container .container-content{padding:0}.monitor-navigation-header[data-v-35a535df]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:14px}.monitor-navigation-header .header-title[data-v-35a535df],.monitor-navigation-header[data-v-35a535df]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-navigation-header .header-title[data-v-35a535df]{color:#63656e;font-size:16px;margin-left:-6px}.monitor-navigation-header .header-title-icon[data-v-35a535df]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:28px;height:28px;font-size:28px;color:#3a84ff;cursor:pointer}.monitor-navigation-header .header-select[data-v-35a535df]{width:240px;margin-left:auto;margin-right:34px;border:none;background:#f0f1f5;color:#63656e;-webkit-box-shadow:none;box-shadow:none}.monitor-navigation-header .header-user[data-v-35a535df]{height:100%;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;color:#96a2b9}.monitor-navigation-header .header-user .bk-icon[data-v-35a535df]{margin-left:5px;font-size:12px}.monitor-navigation-header .header-user[data-v-35a535df]:hover{cursor:pointer;color:#3a84ff}.monitor-navigation-admin[data-v-35a535df]{width:170px #63656e;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-admin .nav-item[data-v-35a535df]{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-admin .nav-item[data-v-35a535df]:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}.tippy-popper .tippy-tooltip.navigation-message-theme{padding:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bk-navigation{width:100%!important;height:100vh;outline:1px solid #ebebeb}.bk-navigation .bk-navigation-wrapper{height:100%;width:100%}.monitor-navigation-nav{width:150px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-nav .nav-item{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-nav .nav-item:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}#container[data-v-4babfc6f]{height:calc(100vh - 52px)}.login-box[data-v-d074f724]{position:absolute;top:50%;left:50%;width:400px;padding:40px;margin:20px auto;-webkit-transform:translate(-50%,-55%);transform:translate(-50%,-55%);background:hsla(0,0%,100%,.9);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 15px 25px rgba(0,0,0,.6);box-shadow:0 15px 25px rgba(0,0,0,.6);border-radius:10px}.login-box p[data-v-d074f724]:first-child{margin:0 0 30px;padding:0;color:#465e65;text-align:center;font-size:1.5rem;font-weight:700;letter-spacing:1px}.login-box .user-box[data-v-d074f724]{position:relative}.login-box .user-box input[data-v-d074f724]{width:100%;padding:10px 0;font-size:16px;color:#8c8c8c;margin-bottom:30px;border:none;border-bottom:1px solid #465e65;outline:none;background:transparent}.login-box .user-box label[data-v-d074f724]{position:absolute;top:0;left:0;padding:10px 0;font-size:16px;color:#465e65;pointer-events:none;-webkit-transition:.5s;transition:.5s}.login-box .user-box input:focus~label[data-v-d074f724],.login-box .user-box input:valid~label[data-v-d074f724]{top:-20px;left:0;color:#465e65;font-size:12px}.login-box form a[data-v-d074f724]{position:relative;display:inline-block;padding:10px 20px;font-weight:700;color:#fff;font-size:16px;text-decoration:none;text-transform:uppercase;overflow:hidden;-webkit-transition:.5s;transition:.5s;margin-top:40px;letter-spacing:3px;width:100%;text-align:center;background:#465e65}.login-box a[data-v-d074f724]:hover{background:#465e65;color:#465e65;border-radius:5px}.login-box a span[data-v-d074f724]{position:absolute;display:block}.login-box a span[data-v-d074f724]:first-child{top:0;left:-100%;width:100%;height:2px;background:-webkit-gradient(linear,left top,right top,from(transparent),to(#fff));background:linear-gradient(90deg,transparent,#fff);-webkit-animation:btn-anim1-data-v-d074f724 1.5s linear infinite;animation:btn-anim1-data-v-d074f724 1.5s linear infinite}@-webkit-keyframes btn-anim1-data-v-d074f724{0%{left:-100%}50%,to{left:100%}}@keyframes btn-anim1-data-v-d074f724{0%{left:-100%}50%,to{left:100%}}.login-box a span[data-v-d074f724]:nth-child(2){top:-100%;right:0;width:2px;height:100%;background:-webkit-gradient(linear,left top,left bottom,from(transparent),to(#fff));background:linear-gradient(180deg,transparent,#fff);-webkit-animation:btn-anim2-data-v-d074f724 1.5s linear infinite;animation:btn-anim2-data-v-d074f724 1.5s linear infinite;-webkit-animation-delay:.375s;animation-delay:.375s}@-webkit-keyframes btn-anim2-data-v-d074f724{0%{top:-100%}50%,to{top:100%}}@keyframes btn-anim2-data-v-d074f724{0%{top:-100%}50%,to{top:100%}}.login-box a span[data-v-d074f724]:nth-child(3){bottom:0;right:-100%;width:100%;height:2px;background:-webkit-gradient(linear,right top,left top,from(transparent),to(#fff));background:linear-gradient(270deg,transparent,#fff);-webkit-animation:btn-anim3-data-v-d074f724 1.5s linear infinite;animation:btn-anim3-data-v-d074f724 1.5s linear infinite;-webkit-animation-delay:.75s;animation-delay:.75s}@-webkit-keyframes btn-anim3-data-v-d074f724{0%{right:-100%}50%,to{right:100%}}@keyframes btn-anim3-data-v-d074f724{0%{right:-100%}50%,to{right:100%}}.login-box a span[data-v-d074f724]:nth-child(4){bottom:-100%;left:0;width:2px;height:100%;background:-webkit-gradient(linear,left bottom,left top,from(transparent),to(#fff));background:linear-gradient(1turn,transparent,#fff);-webkit-animation:btn-anim4-data-v-d074f724 1.5s linear infinite;animation:btn-anim4-data-v-d074f724 1.5s linear infinite;-webkit-animation-delay:1.125s;animation-delay:1.125s}@-webkit-keyframes btn-anim4-data-v-d074f724{0%{bottom:-100%}50%,to{bottom:100%}}@keyframes btn-anim4-data-v-d074f724{0%{bottom:-100%}50%,to{bottom:100%}}.login-box p[data-v-d074f724]:last-child{color:#aaa;font-size:14px}.login-box a.a2[data-v-d074f724]{color:#465e65;text-decoration:none}.login-box a.a2[data-v-d074f724]:hover{background:transparent;color:#aaa;border-radius:5px}.music-item{cursor:pointer}.music-item:hover{color:#1facdd}.label1{width:80px}.parent{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(1,1fr);grid-column-gap:0;grid-row-gap:0;place-items:center}.title2{font-weight:500}.song-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e2e2e2}.song-card:hover{background:#e2e2e2}.add-button{color:#616161}.add-button,.delete-button{width:24px;height:24px;line-height:20px;display:inline-block;background-color:transparent;border:1px solid #ccc;border-radius:5px;margin-left:5px;font-size:12px;text-align:center;cursor:pointer}.delete-button{color:#3f3f3f}.file-section{width:25%;margin:10px 0 10px 10px}.edit-section,.file-section{background:#fff;height:calc(100vh - 75px);overflow:scroll;border:1px solid #173769;border-radius:20px}.edit-section{margin:10px}.resource-section{background:#fff;height:calc(100vh - 75px);width:30%;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:scroll;border:1px solid #173769;margin:10px 10px 10px 0;border-radius:20px}.bk-form-checkbox{margin-right:10px}.success{color:#d1cfc5}.failed{color:#ac354b}.null{color:#333146}button.bk-primary,button.bk-success{background-color:#11406c!important;border-color:#11406c!important}button.bk-button-text{background-color:transparent!important}.bk-form-checkbox.is-checked .bk-checkbox{border-color:#11406c!important;background-color:#11406c!important;background-clip:border-box!important}.bk-button-group .bk-button.is-selected,.bk-button.bk-default:hover{border-color:#11406c!important;color:#11406c!important}.bk-form-radio input[type=radio].is-checked{color:#11406c!important}.bk-steps .bk-step.current .bk-step-icon,.bk-steps .bk-step.current .bk-step-number,.bk-steps .bk-step.current .bk-step-text{border-color:#11406c!important;background-color:#11406c!important}.bk-steps .bk-step.done .bk-step-icon,.bk-steps .bk-step.done .bk-step-number,.bk-steps .bk-step.done .bk-step-text{border-color:#11406c!important;color:#11406c!important}.bk-icon.icon-arrows-left-circle,.bk-icon.icon-arrows-right-circle,.bk-icon.icon-arrows-right-shape{color:#11406c!important}.bk-icon.icon-arrows-down-shape:hover,.bk-icon.icon-arrows-left-shape:hover,.bk-icon.icon-arrows-right-shape:hover{color:#df4d40!important}::-webkit-scrollbar{width:0;background-color:transparent}::-webkit-scrollbar-thumb{background-color:#f4f5f0}.bk-table-header .custom-header-cell{color:inherit;text-decoration:underline;-webkit-text-decoration-style:dashed;text-decoration-style:dashed;text-underline-position:under} \ No newline at end of file +body,html{height:100%;min-width:1280px}::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,0,0,.4)}::-webkit-scrollbar{width:6px;height:8px;background-color:hsla(0,0%,100%,.07)}::-webkit-scrollbar-thumb{border-radius:10px;background:rgba(11,54,106,.52);-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.5)}::-webkit-scrollbar-thumb:window-inactive{background-color:hsla(0,0%,100%,.07)}.pm-title{margin-left:10px}.pm-title .pm-title-block{width:20px;height:22px;margin-top:2px;float:left}.pm-title .ivu-icon-md-settings{font-size:22px;color:#1facdd}.pm-top{border:1px solid #e3e3e3;background-color:#fff;height:80px}.pm-top>div>button,.pm-top>div>div,.pm-top>div>span{vertical-align:middle}.base{position:absolute;width:98%;left:1%;top:42px;padding:10px;z-index:9;border:1px solid #e3e3e3;font-size:0;text-align:center}.base .base_box{display:inline-block;padding-right:30px;vertical-align:top}.base .base_box>span{display:inline-block;font-size:12px;float:left;line-height:32px;height:64px;overflow:auto}.monitor-logo-icon[data-v-15b4569c],.monitor-logo[data-v-15b4569c]{width:32px;height:32px}.bk-wrapper .bk-navigation-wrapper .navigation-container{max-width:100%!important}.bk-wrapper .bk-navigation-wrapper .navigation-container .container-content{padding:0}.monitor-navigation-header[data-v-35a535df]{-webkit-box-flex:1;-ms-flex:1;flex:1;height:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:14px}.monitor-navigation-header .header-title[data-v-35a535df],.monitor-navigation-header[data-v-35a535df]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.monitor-navigation-header .header-title[data-v-35a535df]{color:#63656e;font-size:16px;margin-left:-6px}.monitor-navigation-header .header-title-icon[data-v-35a535df]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:28px;height:28px;font-size:28px;color:#3a84ff;cursor:pointer}.monitor-navigation-header .header-select[data-v-35a535df]{width:240px;margin-left:auto;margin-right:34px;border:none;background:#f0f1f5;color:#63656e;-webkit-box-shadow:none;box-shadow:none}.monitor-navigation-header .header-user[data-v-35a535df]{height:100%;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;color:#96a2b9}.monitor-navigation-header .header-user .bk-icon[data-v-35a535df]{margin-left:5px;font-size:12px}.monitor-navigation-header .header-user[data-v-35a535df]:hover{cursor:pointer;color:#3a84ff}.monitor-navigation-admin[data-v-35a535df]{width:170px #63656e;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-admin .nav-item[data-v-35a535df]{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-admin .nav-item[data-v-35a535df]:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}.tippy-popper .tippy-tooltip.navigation-message-theme{padding:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bk-navigation{width:100%!important;height:100vh;outline:1px solid #ebebeb}.bk-navigation .bk-navigation-wrapper{height:100%;width:100%}.monitor-navigation-nav{width:150px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;border:1px solid #e2e2e2;-webkit-box-shadow:0 3px 4px 0 rgba(64,112,203,.06);box-shadow:0 3px 4px 0 rgba(64,112,203,.06);padding:6px 0;margin:0;color:#63656e}.monitor-navigation-nav .nav-item{-webkit-box-flex:0;-ms-flex:0 0 32px;flex:0 0 32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 20px;list-style:none}.monitor-navigation-nav .nav-item:hover{color:#3a84ff;cursor:pointer;background-color:#f0f1f5}#container[data-v-4babfc6f]{height:calc(100vh - 52px)}.login-box[data-v-acb0944a]{position:absolute;top:50%;left:50%;width:400px;padding:40px;margin:20px auto;-webkit-transform:translate(-50%,-55%);transform:translate(-50%,-55%);background:hsla(0,0%,100%,.9);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 15px 25px rgba(0,0,0,.6);box-shadow:0 15px 25px rgba(0,0,0,.6);border-radius:10px}.login-box p[data-v-acb0944a]:first-child{margin:0 0 30px;padding:0;color:#465e65;text-align:center;font-size:1.5rem;font-weight:700;letter-spacing:1px}.login-box .user-box[data-v-acb0944a]{position:relative}.login-box .user-box input[data-v-acb0944a]{width:100%;padding:10px 0;font-size:16px;color:#8c8c8c;margin-bottom:30px;border:none;border-bottom:1px solid #465e65;outline:none;background:transparent}.login-box .user-box label[data-v-acb0944a]{position:absolute;top:0;left:0;padding:10px 0;font-size:16px;color:#465e65;pointer-events:none;-webkit-transition:.5s;transition:.5s}.login-box .user-box input:focus~label[data-v-acb0944a],.login-box .user-box input:valid~label[data-v-acb0944a]{top:-20px;left:0;color:#465e65;font-size:12px}.login-box form a[data-v-acb0944a]{position:relative;display:inline-block;padding:10px 20px;font-weight:700;color:#fff;font-size:16px;text-decoration:none;text-transform:uppercase;overflow:hidden;-webkit-transition:.5s;transition:.5s;margin-top:40px;letter-spacing:3px;width:100%;text-align:center;background:#465e65}.login-box a[data-v-acb0944a]:hover{background:#465e65;color:#465e65;border-radius:5px}.login-box a span[data-v-acb0944a]{position:absolute;display:block}.login-box a span[data-v-acb0944a]:first-child{top:0;left:-100%;width:100%;height:2px;background:-webkit-gradient(linear,left top,right top,from(transparent),to(#fff));background:linear-gradient(90deg,transparent,#fff);-webkit-animation:btn-anim1-data-v-acb0944a 1.5s linear infinite;animation:btn-anim1-data-v-acb0944a 1.5s linear infinite}@-webkit-keyframes btn-anim1-data-v-acb0944a{0%{left:-100%}50%,to{left:100%}}@keyframes btn-anim1-data-v-acb0944a{0%{left:-100%}50%,to{left:100%}}.login-box a span[data-v-acb0944a]:nth-child(2){top:-100%;right:0;width:2px;height:100%;background:-webkit-gradient(linear,left top,left bottom,from(transparent),to(#fff));background:linear-gradient(180deg,transparent,#fff);-webkit-animation:btn-anim2-data-v-acb0944a 1.5s linear infinite;animation:btn-anim2-data-v-acb0944a 1.5s linear infinite;-webkit-animation-delay:.375s;animation-delay:.375s}@-webkit-keyframes btn-anim2-data-v-acb0944a{0%{top:-100%}50%,to{top:100%}}@keyframes btn-anim2-data-v-acb0944a{0%{top:-100%}50%,to{top:100%}}.login-box a span[data-v-acb0944a]:nth-child(3){bottom:0;right:-100%;width:100%;height:2px;background:-webkit-gradient(linear,right top,left top,from(transparent),to(#fff));background:linear-gradient(270deg,transparent,#fff);-webkit-animation:btn-anim3-data-v-acb0944a 1.5s linear infinite;animation:btn-anim3-data-v-acb0944a 1.5s linear infinite;-webkit-animation-delay:.75s;animation-delay:.75s}@-webkit-keyframes btn-anim3-data-v-acb0944a{0%{right:-100%}50%,to{right:100%}}@keyframes btn-anim3-data-v-acb0944a{0%{right:-100%}50%,to{right:100%}}.login-box a span[data-v-acb0944a]:nth-child(4){bottom:-100%;left:0;width:2px;height:100%;background:-webkit-gradient(linear,left bottom,left top,from(transparent),to(#fff));background:linear-gradient(1turn,transparent,#fff);-webkit-animation:btn-anim4-data-v-acb0944a 1.5s linear infinite;animation:btn-anim4-data-v-acb0944a 1.5s linear infinite;-webkit-animation-delay:1.125s;animation-delay:1.125s}@-webkit-keyframes btn-anim4-data-v-acb0944a{0%{bottom:-100%}50%,to{bottom:100%}}@keyframes btn-anim4-data-v-acb0944a{0%{bottom:-100%}50%,to{bottom:100%}}.login-box p[data-v-acb0944a]:last-child{color:#aaa;font-size:14px}.login-box a.a2[data-v-acb0944a]{color:#465e65;text-decoration:none}.login-box a.a2[data-v-acb0944a]:hover{background:transparent;color:#aaa;border-radius:5px}.music-item{cursor:pointer}.music-item:hover{color:#1facdd}.label1{width:80px}.parent{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(1,1fr);grid-column-gap:0;grid-row-gap:0;place-items:center}.title2{font-weight:500}.song-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e2e2e2}.song-card:hover{background:#e2e2e2}.add-button{color:#616161}.add-button,.delete-button{width:24px;height:24px;line-height:20px;display:inline-block;background-color:transparent;border:1px solid #ccc;border-radius:5px;margin-left:5px;font-size:12px;text-align:center;cursor:pointer}.delete-button{color:#3f3f3f}.file-section{width:25%;margin:10px 0 10px 10px}.edit-section,.file-section{background:#fff;height:calc(100vh - 75px);overflow:scroll;border:1px solid #173769;border-radius:20px}.edit-section{margin:10px}.resource-section{background:#fff;height:calc(100vh - 75px);width:30%;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:scroll;border:1px solid #173769;margin:10px 10px 10px 0;border-radius:20px}.bk-form-checkbox{margin-right:10px}.success{color:#d1cfc5}.failed{color:#ac354b}.null{color:#333146}button.bk-primary,button.bk-success{background-color:#11406c!important;border-color:#11406c!important}button.bk-button-text{background-color:transparent!important}.bk-form-checkbox.is-checked .bk-checkbox{border-color:#11406c!important;background-color:#11406c!important;background-clip:border-box!important}.bk-button-group .bk-button.is-selected,.bk-button.bk-default:hover{border-color:#11406c!important;color:#11406c!important}.bk-form-radio input[type=radio].is-checked{color:#11406c!important}.bk-steps .bk-step.current .bk-step-icon,.bk-steps .bk-step.current .bk-step-number,.bk-steps .bk-step.current .bk-step-text{border-color:#11406c!important;background-color:#11406c!important}.bk-steps .bk-step.done .bk-step-icon,.bk-steps .bk-step.done .bk-step-number,.bk-steps .bk-step.done .bk-step-text{border-color:#11406c!important;color:#11406c!important}.bk-icon.icon-arrows-left-circle,.bk-icon.icon-arrows-right-circle,.bk-icon.icon-arrows-right-shape{color:#11406c!important}.bk-icon.icon-arrows-down-shape:hover,.bk-icon.icon-arrows-left-shape:hover,.bk-icon.icon-arrows-right-shape:hover{color:#df4d40!important}::-webkit-scrollbar{width:0;background-color:transparent}::-webkit-scrollbar-thumb{background-color:#f4f5f0}.bk-table-header .custom-header-cell{color:inherit;text-decoration:underline;-webkit-text-decoration-style:dashed;text-decoration-style:dashed;text-underline-position:under} \ No newline at end of file diff --git a/static/dist/index.prod.html b/static/dist/index.prod.html index 3c7448e..adc0e32 100644 --- a/static/dist/index.prod.html +++ b/static/dist/index.prod.html @@ -1,3 +1,3 @@