Your Name 3 年之前
父節點
當前提交
1237a16ce8
共有 7 個檔案被更改,包括 73 行新增20 行删除
  1. 1
    0
      package.json
  2. 31
    9
      src/layouts/components/Header.vue
  3. 23
    9
      src/layouts/components/SiderBar.vue
  4. 6
    2
      src/pages/index.vue
  5. 2
    0
      src/store/model/note.js
  6. 5
    0
      src/utils/eventBus.js
  7. 5
    0
      yarn.lock

+ 1
- 0
package.json 查看文件

9
   },
9
   },
10
   "dependencies": {
10
   "dependencies": {
11
     "@ant-design/icons-vue": "^6.1.0",
11
     "@ant-design/icons-vue": "^6.1.0",
12
+    "@zjxpcyc/js_event": "^1.0.0",
12
     "@zjxpcyc/vue-tiny-store": "^1.0.1",
13
     "@zjxpcyc/vue-tiny-store": "^1.0.1",
13
     "ant-design-vue": "^3.2.4",
14
     "ant-design-vue": "^3.2.4",
14
     "axios": "^0.27.2",
15
     "axios": "^0.27.2",

+ 31
- 9
src/layouts/components/Header.vue 查看文件

1
 <template>
1
 <template>
2
   <div></div>
2
   <div></div>
3
   <div>
3
   <div>
4
-    <a-menu theme="dark" mode="horizontal" class="menu-navi">
5
-      <a-menu-item key="save" :disabled="disabledItem.save">
4
+    <a-menu theme="dark" mode="horizontal" class="menu-navi" @click="handleMenu">
5
+      <a-menu-item key="save" :disabled="saveDisabledItem">
6
         <template #icon>
6
         <template #icon>
7
           <save-outlined />
7
           <save-outlined />
8
         </template>
8
         </template>
9
         保存
9
         保存
10
       </a-menu-item>
10
       </a-menu-item>
11
-      <a-menu-item key="newfolder" :disabled="disabledItem.newFolder">
11
+      <a-menu-item key="newfolder">
12
         <template #icon>
12
         <template #icon>
13
           <folder-add-outlined />
13
           <folder-add-outlined />
14
         </template>
14
         </template>
16
       </a-menu-item>
16
       </a-menu-item>
17
     </a-menu>
17
     </a-menu>
18
   </div>
18
   </div>
19
+  <a-modal v-model:visible="newFolderVisible" title="新建文件夹" @ok="confirmNewFolder">
20
+    <a-input v-model:value="newFolderName" placeholder="请输入文件夹名称" />
21
+  </a-modal>
19
 </template>
22
 </template>
20
 
23
 
21
 <script setup>
24
 <script setup>
22
-import { computed } from 'vue'
25
+import { computed, ref } from 'vue'
23
 import { useModel } from '@zjxpcyc/vue-tiny-store'
26
 import { useModel } from '@zjxpcyc/vue-tiny-store'
24
 import { SaveOutlined, FolderAddOutlined } from '@ant-design/icons-vue';
27
 import { SaveOutlined, FolderAddOutlined } from '@ant-design/icons-vue';
28
+import eventBus from '@/utils/eventBus'
25
 
29
 
30
+const newFolderVisible = ref(false)
31
+const newFolderName = ref()
26
 const { curMenu } = useModel('menu')
32
 const { curMenu } = useModel('menu')
27
-const disabledItem = computed(() => {
28
-  return {
29
-    save: !curMenu.value || curMenu.value.type !== 'file',
30
-    newFolder: !curMenu.value || curMenu.value.type !== 'dir',
31
-  }
33
+const saveDisabledItem = computed(() => {
34
+  return !curMenu.value || curMenu.value.type !== 'file'
32
 })
35
 })
33
 
36
 
37
+const confirmNewFolder = () => {
38
+  newFolderVisible.value = false
39
+  eventBus.dispatchEvent('menu.newFolder', newFolderName.value)
40
+  newFolderName.value = undefined
41
+}
42
+
43
+const handleMenu = (e) => {
44
+  switch (e.key) {
45
+    case 'save':
46
+      eventBus.dispatchEvent('menu.save')
47
+      break;
48
+    case 'newfolder':
49
+      newFolderVisible.value = true
50
+      break;
51
+    default:
52
+      break;
53
+  }
54
+}
55
+
34
 </script>
56
 </script>
35
 
57
 
36
 <style lang="less" scoped>
58
 <style lang="less" scoped>

+ 23
- 9
src/layouts/components/SiderBar.vue 查看文件

16
 <script setup>
16
 <script setup>
17
 import { useModel } from '@zjxpcyc/vue-tiny-store'
17
 import { useModel } from '@zjxpcyc/vue-tiny-store'
18
 import SubMenu from '@/components/SubMenu.vue';
18
 import SubMenu from '@/components/SubMenu.vue';
19
+import eventBus from '@/utils/eventBus'
19
 
20
 
20
 const props = defineProps({
21
 const props = defineProps({
21
   menuStyle: {
22
   menuStyle: {
29
 const { getNote } = useModel('note')
30
 const { getNote } = useModel('note')
30
 
31
 
31
 if (!menus || !menus.length) {
32
 if (!menus || !menus.length) {
32
-  getMenus(user).then(res => menus.push(...res || []))
33
+  getMenus(user).then(res => {
34
+    menus.push(...(res || []).filter(x => x.path.indexOf('.gitignore') === -1))
35
+  })
33
 }
36
 }
34
 
37
 
35
 const getDeep = (arr, targ, type) => {
38
 const getDeep = (arr, targ, type) => {
36
-    let found = arr.filter(x => x.type === type && x.path === targ)[0]
37
-    if (found) return found;
39
+    const length = arr.length
40
+    for (let i = 0; i < length; i += 1) {
41
+      const it = arr[i]
42
+      if (it.type === type && it.path === targ) {
43
+        return it;
44
+      }
38
 
45
 
39
-    for (it of arr) {
40
-      if (it.type !== type) continue;
46
+      if (it.type === 'dir') {
47
+        const children = it.children
48
+        if (!children || !children.length) continue;
41
 
49
 
42
-      const children = it.children || []
43
-      const found = getDeep(children, targ, type)
44
-      if (found) return found
50
+        const found = getDeep(children, targ, type)
51
+        if (found) return found
52
+      }
45
     }
53
     }
46
 
54
 
47
     return undefined
55
     return undefined
58
 }
66
 }
59
 
67
 
60
 const handleOpenChange = (keys) => {
68
 const handleOpenChange = (keys) => {
61
-  console.log('------------>', keys)
62
   const [ menuId ] = keys
69
   const [ menuId ] = keys
63
   if (!menuId) return;
70
   if (!menuId) return;
64
 
71
 
71
     menu.children = res || []
78
     menu.children = res || []
72
   })
79
   })
73
 }
80
 }
81
+
82
+const createNewFolder = (newFolderName) => {
83
+  console.log('----newFolderName---->', newFolderName)
84
+}
85
+
86
+
87
+eventBus.addEventListener('menu.newFolder', createNewFolder)
74
 </script>
88
 </script>

+ 6
- 2
src/pages/index.vue 查看文件

12
 import { ref, shallowRef, watch, onMounted } from 'vue'
12
 import { ref, shallowRef, watch, onMounted } from 'vue'
13
 import Editor from '@/components/Editor.vue';
13
 import Editor from '@/components/Editor.vue';
14
 import { useModel } from '@zjxpcyc/vue-tiny-store'
14
 import { useModel } from '@zjxpcyc/vue-tiny-store'
15
+import eventBus from '@/utils/eventBus'
15
 
16
 
16
 const mode = 'simple'
17
 const mode = 'simple'
17
 const { user } = useModel('user')
18
 const { user } = useModel('user')
19
 
20
 
20
 const valueHtml = ref()
21
 const valueHtml = ref()
21
 
22
 
22
-const handleSave = (newContent) => {
23
-  updateNote(newContent, user)
23
+const handleSave = () => {
24
+  updateNote(valueHtml.value, user)
24
 }
25
 }
25
 
26
 
26
 watch(note, (newVal) => {
27
 watch(note, (newVal) => {
31
   }
32
   }
32
 }, { immediate: true })
33
 }, { immediate: true })
33
 
34
 
35
+// 监听导航菜单保存按钮
36
+eventBus.addEventListener('menu.save', handleSave)
37
+
34
 </script>
38
 </script>

+ 2
- 0
src/store/model/note.js 查看文件

1
 import { ref } from 'vue'
1
 import { ref } from 'vue'
2
 import request, { BASE_URL } from '@/utils/request'
2
 import request, { BASE_URL } from '@/utils/request'
3
 import { Base64 } from 'js-base64'
3
 import { Base64 } from 'js-base64'
4
+import { message } from 'ant-design-vue';
4
 
5
 
5
 export default function useNote() {
6
 export default function useNote() {
6
   const note = ref()
7
   const note = ref()
23
     const filePath = url.replace(BASE_URL, '')
24
     const filePath = url.replace(BASE_URL, '')
24
 
25
 
25
     return request.put(filePath, data).then(() => {
26
     return request.put(filePath, data).then(() => {
27
+      message.success('保存成功');
26
       // 获取最新的数据, 目的是更新 sha 值
28
       // 获取最新的数据, 目的是更新 sha 值
27
       request.get(filePath, { params: { access_token } }).then(res => note.value = res)
29
       request.get(filePath, { params: { access_token } }).then(res => note.value = res)
28
     })
30
     })

+ 5
- 0
src/utils/eventBus.js 查看文件

1
+import createEvent from '@zjxpcyc/js_event'
2
+
3
+const eventBus = createEvent();
4
+
5
+export default eventBus;

+ 5
- 0
yarn.lock 查看文件

181
   resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.34.tgz#b71750d05120feb644102088a09be64518cd3a86"
181
   resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.34.tgz#b71750d05120feb644102088a09be64518cd3a86"
182
   integrity sha512-zhEeB8TrFmTXmTXmu/wcjEhgrjO4xqdDQrCdPhjX7NxfoLqoBVKguOm8qyihWNLbP+41svYY4za9mqXyqFLzNg==
182
   integrity sha512-zhEeB8TrFmTXmTXmu/wcjEhgrjO4xqdDQrCdPhjX7NxfoLqoBVKguOm8qyihWNLbP+41svYY4za9mqXyqFLzNg==
183
 
183
 
184
+"@zjxpcyc/js_event@^1.0.0":
185
+  version "1.0.0"
186
+  resolved "https://registry.yarnpkg.com/@zjxpcyc/js_event/-/js_event-1.0.0.tgz#25688d9ac263700a8ed8d702c1517bcd827934d1"
187
+  integrity sha512-Nz9bHp0DcdWbgNQQ54uFXoAONvOcrzzqbNUxMp6GTOWP4y14jOZowsLwb1mYNcVxBlkar4Ds0WTIoRyx8sOpRw==
188
+
184
 "@zjxpcyc/vue-tiny-store@^1.0.1":
189
 "@zjxpcyc/vue-tiny-store@^1.0.1":
185
   version "1.0.1"
190
   version "1.0.1"
186
   resolved "https://registry.npmmirror.com/@zjxpcyc/vue-tiny-store/-/vue-tiny-store-1.0.1.tgz#9e67c0f08e9bddd802bdcb543a28c18181e27395"
191
   resolved "https://registry.npmmirror.com/@zjxpcyc/vue-tiny-store/-/vue-tiny-store-1.0.1.tgz#9e67c0f08e9bddd802bdcb543a28c18181e27395"