diff --git a/src/App.vue b/src/App.vue
index f2ea87a..5f1db83 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -113,7 +113,6 @@ onMounted(async () => {
await init(messageProviderRef.value?.alertTip)
pluginCenter = usePluginCenter()
pluginCenter.usePlugin('miaoDirectory', [rootDirectory], [])
- console.log(rootDirectory.tree)
})
// @ts-ignore
@@ -138,7 +137,7 @@ provide('rootDirectory', rootDirectory)
-
+
diff --git a/src/class/PluginCenter.ts b/src/class/PluginCenter.ts
index b8f05d0..b374084 100644
--- a/src/class/PluginCenter.ts
+++ b/src/class/PluginCenter.ts
@@ -2,6 +2,7 @@ import useVirtualPages from "@/hooks/useVirtualPages";
import VirtualDirectory, { VirtualFile } from "./VirtualDirectory";
import { ShallowRef, shallowRef } from "vue";
import { alertTipType, usePluginHooksType } from "@/types/type";
+import VirtualPage from "./VirtualPage";
export enum PluginGroup {
default = "default",
@@ -17,6 +18,8 @@ export interface registerComponentOption {
filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean;
disable?: boolean;
exitConfirm?: boolean;
+ // 若为true,则只会创建一个页面,当存在已创建页面则会直接将VFile和VDir加到curr里面
+ single?: boolean;
}
export type Plugin = {
@@ -31,12 +34,7 @@ export type Plugin = {
// 判断在未禁用时是否可以使用这个组件
// 使用组件即调用下面的func
filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean;
- func: (
- VDirectories: VirtualDirectory[],
- VFiles: VirtualFile[],
- hooks: usePluginHooksType,
- ...args: any[]
- ) => void;
+ func: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[], hooks: usePluginHooksType, ...args: any[]) => void;
};
export default class PluginCenter {
@@ -58,7 +56,7 @@ export default class PluginCenter {
* 便捷地注册一个组件为插件,触发时直接用新页面打开
*/
registerComponent(option: registerComponentOption): void {
- const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false } = option;
+ const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false, single = false } = option;
let _component: any;
const views = useVirtualPages();
this.register(key, {
@@ -81,11 +79,18 @@ export default class PluginCenter {
timeout: 2000
});
}
- views.push(_component, VDirectories, VFiles, {
- VirtualPageOption: {
- exitConfirm
- }
- });
+ if (single && views.find(_component) !== undefined) {
+ const view = views.find(_component) as VirtualPage;
+ view.currentFiles = [...view.currentFiles, ...VFiles];
+ view.currentDirectories = [...view.currentDirectories, ...VDirectories];
+ } else {
+ views.push(_component, VDirectories, VFiles, {
+ VirtualPageOption: {
+ exitConfirm,
+ allowCopy: single === false
+ }
+ });
+ }
}
});
}
@@ -112,8 +117,13 @@ export default class PluginCenter {
}
usePlugin(key: string, VDirectories?: VirtualDirectory[], VFiles?: VirtualFile[], ...args: any[]) {
- this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], {
- globalAlertTip: this.globalAlertTip
- }, ...args);
+ this.pluginsMap[key].func(
+ VDirectories ?? [],
+ VFiles ?? [],
+ {
+ globalAlertTip: this.globalAlertTip
+ },
+ ...args
+ );
}
}
diff --git a/src/class/VirtualDirectory.ts b/src/class/VirtualDirectory.ts
index 890a730..3b7a3d1 100644
--- a/src/class/VirtualDirectory.ts
+++ b/src/class/VirtualDirectory.ts
@@ -36,6 +36,7 @@ export class VirtualFile {
stats: stats;
parent: VirtualDirectory;
id: number;
+ storage: {[key: string]: any} = {};
get path() {
return `${this.parent.path}${this.name}`;
}
@@ -48,7 +49,6 @@ export class VirtualFile {
class VirtualDirectory {
constructor(info: directory, parent?: VirtualDirectory) {
this.name = info.name;
- this.type = "directory";
this.stats = info.stats;
this.parent = parent ?? undefined;
this.id = generateId();
@@ -60,7 +60,7 @@ class VirtualDirectory {
// 子目录
directories?: VirtualDirectory[];
// 没啥意义,标注一下就是了
- type: "directory";
+ type: "directory" = 'directory';
// 文件夹创建时间等杂项属性
stats: stats;
// 父文件夹
@@ -68,6 +68,8 @@ class VirtualDirectory {
id: number;
+ storage: {[key: string]: any} = {};
+
/**
* 获取相对于根目录的路径的层数
* 用于目录下文件定位
diff --git a/src/class/VirtualPage.ts b/src/class/VirtualPage.ts
index 91bebd7..c30bf85 100644
--- a/src/class/VirtualPage.ts
+++ b/src/class/VirtualPage.ts
@@ -1,9 +1,10 @@
-import { reactive, shallowRef } from 'vue'
+import { Component, reactive, shallowRef } from 'vue'
import VirtualDirectory, { VirtualFile } from './VirtualDirectory'
import generateId from '@/hooks/generateId'
export interface VirtualPageOption {
exitConfirm?: boolean
+ allowCopy?: boolean
}
export interface ViewsPushOption {
@@ -44,6 +45,7 @@ export default class VirtualPage {
this.refreshKey = Math.random()
this.color = getRandomWebSafeColor()
this.exitConfirm = initObjects?.option?.exitConfirm ?? false
+ this.allowCopy = initObjects?.option?.allowCopy ?? true
}
// 页面使用的组件
component: any
@@ -61,8 +63,10 @@ export default class VirtualPage {
color: string
// 用于展示的title
_title?: string
- // 关闭时是否需要确认
+ // 关闭时是否需要确认(未实现)
exitConfirm: boolean
+ // 是否允许复制页面
+ allowCopy: boolean
get title() {
if (this._title) {
@@ -155,4 +159,11 @@ export class VirtualPages {
deleteView(index: number) {
this._views.splice(index, 1)
}
+
+ /**
+ * 返回第一个使用此组件的页面
+ */
+ find(component: Component) {
+ return this._views.find(v=>v.component === component)
+ }
}
diff --git a/src/plugins/miaoMusicPlayer/export.ts b/src/plugins/miaoMusicPlayer/export.ts
index d370124..0728628 100644
--- a/src/plugins/miaoMusicPlayer/export.ts
+++ b/src/plugins/miaoMusicPlayer/export.ts
@@ -25,7 +25,8 @@ const pluginConfig: registerComponentOption = {
}
return vFiles[0].name.endsWith('?')
},
- disable: false
+ disable: false,
+ single: true
}
export default pluginConfig
diff --git a/src/plugins/miaoMusicPlayer/hooks/aplayerMiao.ts b/src/plugins/miaoMusicPlayer/hooks/aplayerMiao.ts
new file mode 100644
index 0000000..89ad1c5
--- /dev/null
+++ b/src/plugins/miaoMusicPlayer/hooks/aplayerMiao.ts
@@ -0,0 +1,42 @@
+import { createApp, Reactive } from "vue";
+import aplayerListNew from "../src/aplayerListNew.vue";
+import apType from "../types/ap";
+
+/**
+ * 对aplayer进行一些自定义的风格优化
+ */
+const useAplayerMiao = (ap: Reactive) => {
+ const container = ap.container as HTMLDivElement;
+
+ // 隐藏旧版歌单
+ const old_listDom = container.querySelector(".aplayer-list") as HTMLDivElement;
+ old_listDom.style.display = "none";
+
+ // 新版歌单
+ const new_list_dom = document.createElement("div");
+ new_list_dom.classList.add("aplayer-list");
+ new_list_dom.style.maxHeight = ap.options.listMaxHeight;
+
+ ap.on("listadd", () => {
+ ap.list.audios.forEach(v => {
+ !v.id && (v.id = Math.random());
+ });
+ });
+ ap.on("listshow", () => {
+ new_list_dom.classList.remove("aplayer-list-hide");
+ });
+ ap.on("listhide", () => {
+ new_list_dom.classList.add("aplayer-list-hide");
+ });
+
+ container.appendChild(new_list_dom);
+ const app = createApp(aplayerListNew, { ap });
+ app.mount(new_list_dom);
+
+ ap.on("destroy", () => {
+ app.unmount();
+ });
+ return app;
+};
+
+export default useAplayerMiao;
diff --git a/src/plugins/miaoMusicPlayer/miaoMusicPlayerDemo.vue b/src/plugins/miaoMusicPlayer/miaoMusicPlayerDemo.vue
index 0b65b81..c5e0662 100644
--- a/src/plugins/miaoMusicPlayer/miaoMusicPlayerDemo.vue
+++ b/src/plugins/miaoMusicPlayer/miaoMusicPlayerDemo.vue
@@ -1,6 +1,10 @@
@@ -8,40 +12,60 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/plugins/miaoMusicPlayer/types/ap.ts b/src/plugins/miaoMusicPlayer/types/ap.ts
new file mode 100644
index 0000000..231d1ee
--- /dev/null
+++ b/src/plugins/miaoMusicPlayer/types/ap.ts
@@ -0,0 +1,40 @@
+export type audioType = {
+ url: string
+ artist: string
+ cover?: string
+ name: string
+ theme?: string
+ id?: number
+ index: number
+}
+
+type apType = {
+ list: {
+ audios: audioType[]
+ index: number
+ switch: (index: number) => void
+ remove: (index: number) => void
+ add: (audios: audioType[]) => void
+ refreshAudioIndex: () => void
+ }
+ container: HTMLDivElement
+ on: (event: string, callback: () => void) => void
+ options: {
+ audio: audioType[],
+ autoplay: boolean,
+ "volume": number,
+ "theme": string,
+ "mini": boolean,
+ "fixed": boolean,
+ "mutex": boolean,
+ "lrcType": number,
+ "preload": "auto",
+ "loop": "all",
+ "order": "list",
+ "listMaxHeight": string,
+ "storageName": "aplayer-setting"
+ },
+ destroy: () => {}
+}
+
+export default apType
\ No newline at end of file