Your Name 3 년 전
부모
커밋
31ad203cb4
5개의 변경된 파일91개의 추가작업 그리고 26개의 파일을 삭제
  1. 37
    12
      src/components/ContextMenu.vue
  2. 9
    5
      src/components/SubMenu.vue
  3. 5
    5
      src/layouts/components/SiderBar.vue
  4. 17
    0
      src/service/gitee.js
  5. 23
    4
      src/store/model/note.js

+ 37
- 12
src/components/ContextMenu.vue 파일 보기

@@ -11,32 +11,57 @@
11 11
 </template>
12 12
 
13 13
 <script setup>
14
-import { reactive, ref } from 'vue'
14
+import { computed, reactive, ref } from 'vue'
15
+import { Modal } from 'ant-design-vue'
15 16
 import eventBus from '@/utils/eventBus'
16 17
 
18
+const emit = defineEmits(['newFile', 'newFolder', 'deleteFile'])
19
+
17 20
 const modelProps = reactive({ visible: false, title: undefined })
18 21
 const inputText = ref()
19 22
 
20 23
 const menuRef = ref()
21 24
 const contextMenuRef = ref()
22
-const contextMenuOptions = [
23
-  { id: 'newFolder', name: '新建文件夹' },
24
-  { type: 'divider', class: 'cm-option-divider' },
25
-  { id: 'newFile', name: '新建文件' },
26
-]
25
+const typeRef = ref('folder')
27 26
 const optionRef = ref()
28 27
 
29
-const emit = defineEmits(['newFile', 'newFolder'])
28
+const contextMenuOptions = computed(() => {
29
+  const folderOpts = [
30
+    { id: 'newFolder', name: '新建文件夹' },
31
+    { type: 'divider', class: 'cm-option-divider' },
32
+    { id: 'newFile', name: '新建文件' },
33
+  ]
30 34
 
31
-const onContextMenu = ({ event, menu }) => {
32
-  contextMenuRef.value.showMenu(event)
35
+  const fileOpts = [
36
+    { id: 'deleteFile', name: '删除...' },
37
+  ]
38
+
39
+  return typeRef.value === 'folder' ? folderOpts : fileOpts
40
+})
41
+
42
+const onContextMenu = ({ event, menu, type = 'folder' }) => {
33 43
   menuRef.value = menu
44
+  typeRef.value = type
45
+  contextMenuRef.value.showMenu(event)
34 46
 }
35 47
 
36 48
 const optionClicked = (event) => {
37
-  modelProps.visible = true
38
-  modelProps.title = event.option.name
39
-  optionRef.value = event.option
49
+  const option = event.option
50
+  if (option.id === 'deleteFile') {
51
+    if (menuRef.value && menuRef.value.name) {
52
+      const noteName = menuRef.value.name.replace(/\.html$/, '')
53
+      Modal.confirm({
54
+        title: `确定删除日记 ${noteName} ?`,
55
+        onOk() {
56
+          emit('deleteFile', menuRef.value)
57
+        },
58
+      })
59
+    }
60
+  } else {
61
+    modelProps.visible = true
62
+    modelProps.title = option.name
63
+    optionRef.value = option
64
+  }
40 65
 }
41 66
 
42 67
 const confirmNew = () => {

+ 9
- 5
src/components/SubMenu.vue 파일 보기

@@ -4,8 +4,8 @@
4 4
       v-if="menu.type === 'dir'"
5 5
       :key="`/@@dir@@/${menu.path}`"
6 6
     >
7
-      <template #title>        
8
-        <div class="dir-context-menu" @contextmenu.prevent.stop="event => onContextMenu(event, menu)">
7
+      <template #title>
8
+        <div class="dir-context-menu" @contextmenu.prevent.stop="event => onContextMenu(event, menu, 'folder')">
9 9
           {{ trimSuffix(menu.name) }}
10 10
         </div>
11 11
       </template>
@@ -13,7 +13,11 @@
13 13
         <SubMenu :menus="menu.children" :sub-menu="SubMenu" />
14 14
       </template>
15 15
     </a-sub-menu>
16
-    <a-menu-item v-else :key="`/@@file@@/${menu.path}`">{{ trimSuffix(menu.name) }}</a-menu-item>
16
+    <a-menu-item v-else :key="`/@@file@@/${menu.path}`">
17
+      <div class="dir-context-menu" @contextmenu.prevent.stop="event => onContextMenu(event, menu, 'file')">
18
+        {{ trimSuffix(menu.name) }}
19
+      </div>
20
+    </a-menu-item>
17 21
   </template>
18 22
 </template>
19 23
 
@@ -29,8 +33,8 @@ const props = defineProps({
29 33
 
30 34
 const SubMenu = props.subMenu
31 35
 
32
-const onContextMenu = (event, menu) => {
33
-  eventBus.dispatchEvent('menu.contextMenu', { event, menu })
36
+const onContextMenu = (event, menu, type = 'folder') => {
37
+  eventBus.dispatchEvent('menu.contextMenu', { event, menu, type })
34 38
 }
35 39
 
36 40
 const trimSuffix = name => {

+ 5
- 5
src/layouts/components/SiderBar.vue 파일 보기

@@ -15,7 +15,7 @@
15 15
       </a-menu-item-group>
16 16
       <SubMenu :menus="fileTree" :sub-menu="SubMenu"></SubMenu>
17 17
     </a-menu>
18
-    <ContextMenu @newFile="createNewFile" @newFolder="createNewFolder" />
18
+    <ContextMenu @newFile="createNewFile" @deleteFile="deleteFile" @newFolder="createNewFolder" />
19 19
   </div>
20 20
 </template>
21 21
 
@@ -33,11 +33,8 @@ const props = defineProps({
33 33
   }
34 34
 })
35 35
 
36
-
37 36
 const { user } = useModel('user')
38
-const { curMenu, menus, getMenus } = useModel('menu')
39
-const { fileArr, fileTree, getNote, newNote, getFiles, newFolder } = useModel('note')
40
-const { newFile } = useModel('repo')
37
+const { fileArr, fileTree, getNote, newNote, getFiles, newFolder, deleteNote } = useModel('note')
41 38
 
42 39
 const repo = 'my-note'
43 40
 const rootPath = ''
@@ -78,6 +75,9 @@ const createNewFolder = ({ menu: parentMenu, name: newFolderName }) => {
78 75
   newFolder(user, newFilePath, repo)
79 76
 }
80 77
 
78
+const deleteFile = (menu) => {
79
+  deleteNote(user, menu.path, repo)
80
+}
81 81
 
82 82
 const onContextMenu = (event) => {
83 83
   eventBus.dispatchEvent('menu.contextMenu', { event })

+ 17
- 0
src/service/gitee.js 파일 보기

@@ -127,3 +127,20 @@ export const updateFile = (user, fileInfo) => {
127 127
 
128 128
   return request.put(path, data, options)
129 129
 }
130
+
131
+export const deleteFile = (user, fileInfo, repo = 'my-note') => {
132
+  const { access_token } = getToken() || {}
133
+  const { path, sha } = fileInfo
134
+
135
+  const params = {
136
+    access_token,
137
+    sha,
138
+    message: 'delete file'
139
+  }
140
+  const options = {
141
+    loading: 'loading.menu',
142
+    params,
143
+  }
144
+
145
+  return request.delete(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, options)
146
+}

+ 23
- 4
src/store/model/note.js 파일 보기

@@ -1,4 +1,4 @@
1
-import { reactive, ref } from 'vue'
1
+import { reactive, ref, computed } from 'vue'
2 2
 import { message } from 'ant-design-vue';
3 3
 import * as gitee from '@/service/gitee'
4 4
 
@@ -10,7 +10,7 @@ const getParentPath = path => {
10 10
 
11 11
 export default function useNote() {
12 12
   const fileArr = reactive([])
13
-  const fileTree = reactive([])
13
+  // const fileTree = reactive([])
14 14
   const note = ref()
15 15
 
16 16
   // 获取目录下所有问题件
@@ -20,9 +20,7 @@ export default function useNote() {
20 20
 
21 21
       if (!path) {
22 22
         fileArr.splice(0)
23
-        fileTree.splice(0)
24 23
         fileArr.push(...files)
25
-        fileTree.push(...files)
26 24
       } else {
27 25
         const dir = fileArr.filter(x => x.type === 'dir' && x.path === path)[0]
28 26
         dir.children = files
@@ -31,6 +29,10 @@ export default function useNote() {
31 29
     })
32 30
   }
33 31
 
32
+  const fileTree = computed(() => {
33
+    return fileArr.filter(x => x.path === x.name)
34
+  })
35
+
34 36
   const getNote = (user, path = '', repo = 'my-note') => {
35 37
     return gitee.getFile(user, path, repo).then(res => note.value = res)
36 38
   }
@@ -57,6 +59,22 @@ export default function useNote() {
57 59
       getFiles(user, getParentPath(path), repo)
58 60
     })
59 61
   }
62
+
63
+  const deleteNote = (user, path, repo = 'my-note') => {
64
+    let pos = 0
65
+    let file = undefined
66
+    for (; pos < fileArr.length; pos ++) {
67
+      if (fileArr[pos].path === path) {
68
+        file = fileArr[pos]
69
+        break;
70
+      }
71
+    }
72
+
73
+    if (!file) return;
74
+    gitee.deleteFile(user, { path, sha: file.sha }, repo).then(() => {
75
+      fileArr.splice(pos, 1)
76
+    })
77
+  }
60 78
   
61 79
   return {
62 80
     fileArr,
@@ -67,5 +85,6 @@ export default function useNote() {
67 85
     getNote,
68 86
     newNote,
69 87
     updateNote,
88
+    deleteNote,
70 89
   }
71 90
 }