Your Name 3 years ago
parent
commit
4d57e29950

+ 1
- 1
src/components/SubMenu.vue View File

9
           <template #title>
9
           <template #title>
10
             <ContextMenuVue @menuClick="tipVisible = false" />
10
             <ContextMenuVue @menuClick="tipVisible = false" />
11
           </template>
11
           </template>
12
-          <div @contextmenu="handleContextMenu(`/@@dir@@/${menu.path}`)">
12
+          <div @contextmenu.stop="handleContextMenu(`/@@dir@@/${menu.path}`)">
13
             {{menu.name}}
13
             {{menu.name}}
14
           </div>
14
           </div>
15
           </a-tooltip>
15
           </a-tooltip>

+ 30
- 10
src/layouts/components/SiderBar.vue View File

91
   })
91
   })
92
 }
92
 }
93
 
93
 
94
-const createNewFolder = (newFolderName) => {
95
-  if (!curMenu.value) return;
96
-
97
-  const path = curMenu.value.path + `/${newFolderName}`
98
-
99
-  newFolder(path, user).then(() => {
100
-    // 获取父级信息, 目的刷新当前目录
101
-    getMenus(user, curMenu.value.path).then(res => {
102
-      curMenu.value.children = res || []
94
+// 创建新文件
95
+const createNewFile = (newFileName) => {
96
+  const parentPath = curMenu.value ? curMenu.value.path : undefined
97
+  const newFilePath = parentPath ? `${parentPath}/${newFileName}.html` : `${newFileName}.html`
98
+
99
+  newFile('又是一篇崭新的日记...', newFilePath, user).then(() => {
100
+    getMenus(user, parentPath).then(res => {
101
+      const newDIR = (res || []).filter(x => x.path.indexOf('.gitignore') === -1)
102
+      if (curMenu.value) {
103
+        curMenu.value.children = newDIR
104
+      } else {
105
+        menus.splice().push(...newDIR || [])
106
+      }
103
     })
107
     })
104
   })
108
   })
105
-
106
 }
109
 }
107
 
110
 
111
+// 创建新目录
112
+const createNewFolder = (newFolderName) => {
113
+  const parentPath = curMenu.value ? curMenu.value.path : undefined
114
+  const newFilePath = parentPath ? `${parentPath}/${newFolderName}` : newFolderName
115
+
116
+  newFolder(newFilePath, user).then(() => {
117
+    getMenus(user, parentPath).then(res => {
118
+      const newDIR = (res || []).filter(x => x.path.indexOf('.gitignore') === -1)
119
+      if (curMenu.value) {
120
+        curMenu.value.children = newDIR
121
+      } else {
122
+        menus.push(...newDIR || [])
123
+      }
124
+    })
125
+  })
126
+}
108
 
127
 
128
+eventBus.addEventListener('menu.newFile', createNewFile)
109
 eventBus.addEventListener('menu.newFolder', createNewFolder)
129
 eventBus.addEventListener('menu.newFolder', createNewFolder)
110
 </script>
130
 </script>

+ 17
- 14
src/route.js View File

25
   routes, // `routes: routes` 的缩写
25
   routes, // `routes: routes` 的缩写
26
 })
26
 })
27
 
27
 
28
+const isEmpty = x => !x || !x.length || !Object.keys(x).length
29
+
28
 router.beforeEach((to, from, next) => {
30
 router.beforeEach((to, from, next) => {
29
   NProgress.start();
31
   NProgress.start();
30
   const { user, getUserInfo } = store.getState('user')
32
   const { user, getUserInfo } = store.getState('user')
31
-  if (!user.token) {
33
+
34
+  if (to.name === 'login') {
32
     NProgress.done();
35
     NProgress.done();
33
-    if (to.name != 'login') {
34
-      next({ name: 'login' })
35
-    } else {
36
-      next()
37
-    }
38
-  } else {
39
-    if (!user.id && to.name != 'login') {
40
-      getUserInfo(user.token).then(() => {
41
-        NProgress.done();
42
-        next()
43
-      })
44
-    } else {
36
+    return next()
37
+  }
38
+
39
+  if (isEmpty(user)) {    
40
+    getUserInfo(user.token).then(() => {
45
       NProgress.done();
41
       NProgress.done();
46
       next()
42
       next()
47
-    }
43
+    }).catch(() => {
44
+      NProgress.done();
45
+      next({ name: 'login' })
46
+    })
47
+    return
48
+  } else {
49
+    NProgress.done();
50
+    next()
48
   }
51
   }
49
   
52
   
50
 })
53
 })

+ 108
- 0
src/service/gitee.js View File

1
+
2
+import { Base64 } from 'js-base64'
3
+import request, { BASE_URL } from '@/utils/request'
4
+import { getToken, setToken } from '@/utils/token'
5
+
6
+// 获取当前用户信息
7
+export const getCurrentUser = () => {
8
+  const { access_token } = getToken() || {}
9
+  return request.get('/api/v5/user', { params: { access_token } })
10
+}
11
+
12
+// 登录
13
+export const signIn = (data) => {
14
+  return request.post('/oauth/token', data, { contentType: 'application/x-www-form-urlencoded' }).then(res => {
15
+    setToken(res)
16
+    return res;
17
+  })
18
+}
19
+
20
+// 刷新 token
21
+export const refreshToken = (token) => {
22
+  const { refresh_token } = token || {}
23
+  return request.post('/oauth/token', null, { params: { grant_type: 'refresh_token', refresh_token } }).then(res => {
24
+    setToken(res)
25
+    return res
26
+  })
27
+}
28
+
29
+// 获取仓库信息
30
+export const getRepo = (user, repo = 'my-note') => {
31
+  const { access_token } = getToken() || {}
32
+  return request.get(`/api/v5/repos/${user.login}/${repo}`, { params: { access_token } })
33
+}
34
+
35
+// 新建仓库
36
+export const newRepo = (name = 'my-note') => {
37
+  const { access_token } = getToken() || {}
38
+  const data = {
39
+    access_token,
40
+    name,
41
+    private: false,
42
+    auto_init: true,
43
+  }
44
+  return request.post('/api/v5/user/repos', data)
45
+}
46
+
47
+// 创建分支
48
+export const newBranch = (user, branch_name = 'master', repo = 'my-note') => {
49
+  const { access_token } = getToken() || {}
50
+  const data = {
51
+    access_token,
52
+    refs: 'master',
53
+    branch_name,
54
+  }
55
+  return request.post(`/api/v5/repos/${user.login}/${repo}`, data)
56
+}
57
+
58
+// 获取文件树
59
+export const getTree = (user, repo = 'my-note') => {
60
+  const { access_token } = getToken() || {}
61
+  const sha = '4f26aeafdb2367620a393c973eddbe8f8b846ebd' // master
62
+  return request.get(`/api/v5/repos/${user.login}/${repo}/git/trees/${sha}`, { params: { access_token, recursive: 1 } })
63
+}
64
+
65
+// 获取文件列表
66
+export const getFiles = (user, path = '', repo = 'my-note') => {
67
+  const { access_token } = getToken() || {}
68
+  return request.get(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, { params: { access_token } })
69
+}
70
+
71
+// 获取文件详情
72
+export const getFile = (user, path = '', repo = 'my-note') => {
73
+  const { access_token } = getToken() || {}
74
+  return request.get(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, { params: { access_token } })
75
+}
76
+
77
+// 新增文件
78
+export const newFile = (user, content, path, repo = 'my-note') => {
79
+  const { access_token } = getToken() || {}
80
+  const data = {
81
+    access_token,
82
+    content: Base64.encode(content),
83
+    message: new Date().toJSON(),
84
+  }
85
+  return request.post(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, data)
86
+}
87
+
88
+// 新增目录, 其实就是新增一个 内容是 # 的 .gitignore 文件
89
+export const newFolder = (user, path, repo = 'my-note') => {
90
+  const filePath = `${path}/.gitignore`
91
+  return newFile('#', filePath, user, repo)
92
+}
93
+
94
+// 更新文件
95
+export const updateFile = (user, content, fileInfo) => {
96
+  const { access_token } = getToken() || {}
97
+  const { url, sha } = fileInfo
98
+  const data = {
99
+    access_token,
100
+    content: Base64.encode(content),
101
+    sha,
102
+    message: new Date().toJSON(),
103
+  }
104
+
105
+  const filePath = url.replace(BASE_URL, '')
106
+
107
+  return request.put(filePath, data)
108
+}

+ 6
- 3
src/store/model/menu.js View File

1
 import { reactive, ref } from "vue";
1
 import { reactive, ref } from "vue";
2
-import request from '@/utils/request'
2
+import * as gitee from '@/service/gitee'
3
 
3
 
4
 export default function useMenu() {
4
 export default function useMenu() {
5
   const menus = reactive([])
5
   const menus = reactive([])
6
   const curMenu = ref()
6
   const curMenu = ref()
7
 
7
 
8
   const getMenus = (user, path = '', repo = 'my-note') => {
8
   const getMenus = (user, path = '', repo = 'my-note') => {
9
-    const { access_token } = user.token
10
-    return request.get(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, { params: { access_token } })
9
+    gitee.getTree(user, repo).then(console.log)
10
+
11
+    return gitee.getFiles(user, path, repo).then(res => {
12
+      menus.push(...res)
13
+    })
11
   }
14
   }
12
 
15
 
13
   return {
16
   return {

+ 8
- 29
src/store/model/repo.js View File

1
-import { reactive } from "vue";
2
-import { Base64 } from 'js-base64'
3
-import request from '@/utils/request'
1
+import { reactive, ref } from "vue";
2
+import * as gitee from '@/service/gitee'
4
 
3
 
5
 export default function useRepo() {
4
 export default function useRepo() {
6
   const repo = reactive({})
5
   const repo = reactive({})
6
+  const user = ref()
7
 
7
 
8
   const getRepo = (user, repo = 'my-note') => {
8
   const getRepo = (user, repo = 'my-note') => {
9
-    const { access_token } = user.token
10
-    return request.get(`/api/v5/repos/${user.login}/${repo}`, { params: { access_token } }).then(res => Object.assign(repo, res))
9
+    return gitee.getRepo(user, repo).then(res => Object.assign(repo, res))
11
   }
10
   }
12
 
11
 
13
   const newRepo = (user, name = 'my-note') => {
12
   const newRepo = (user, name = 'my-note') => {
14
-    const { access_token } = user.token
15
-    const data = {
16
-      access_token,
17
-      name,
18
-      private: false,
19
-      auto_init: true,
20
-    }
21
-    return request.post('/api/v5/user/repos', data).then(res => Object.assign(repo, res))
13
+    return gitee.newRepo(data).then(res => Object.assign(repo, res))
22
   }
14
   }
23
 
15
 
24
   const newBranch = (user, branch_name = 'master', repo = 'my-note') => {
16
   const newBranch = (user, branch_name = 'master', repo = 'my-note') => {
25
-    const { access_token } = user.token
26
-    const data = {
27
-      access_token,
28
-      refs: 'master',
29
-      branch_name,
30
-    }
31
-    return request.post(`/api/v5/repos/${user.login}/${repo}`, data).then(res => Object.assign(repo, res))
17
+    return gitee.newBranch(user, branch_name, repo).then(res => Object.assign(repo, res))
32
   }
18
   }
33
 
19
 
34
   // 新增文件
20
   // 新增文件
35
   const newFile = (content, path, user, repo = 'my-note') => {
21
   const newFile = (content, path, user, repo = 'my-note') => {
36
-    const { access_token } = user.token
37
-    const data = {
38
-      access_token,
39
-      content: Base64.encode(content),
40
-      message: new Date().toJSON(),
41
-    }
42
-    return request.post(`/api/v5/repos/${user.login}/${repo}/contents/${path}`, data)
22
+    return gitee.newFile(user, content, path, repo)
43
   }
23
   }
44
   
24
   
45
   // 新增目录, 其实就是新增一个 内容是 # 的 .gitignore 文件
25
   // 新增目录, 其实就是新增一个 内容是 # 的 .gitignore 文件
46
   const newFolder = (path, user, repo = 'my-note') => {
26
   const newFolder = (path, user, repo = 'my-note') => {
47
-    const filePath = `${path}/.gitignore`
48
-    return newFile('#', filePath, user, repo)
27
+    return gitee.newFile(user, path, repo)
49
   }
28
   }
50
 
29
 
51
   return {
30
   return {

+ 16
- 23
src/store/model/user.js View File

1
 import { reactive } from 'vue'
1
 import { reactive } from 'vue'
2
-import request from '@/utils/request'
3
-import { getToken, setToken } from '@/utils/token'
2
+import * as gitee from '@/service/gitee'
3
+import { getToken } from '@/utils/token'
4
 
4
 
5
 export default function useUser() {
5
 export default function useUser() {
6
-  const user = reactive({ token: getToken() })
6
+  const user = reactive({})
7
 
7
 
8
-  const signIn = (data) => {
9
-    return request.post('/oauth/token', data, { contentType: 'application/x-www-form-urlencoded' }).then(res => {
10
-      setToken(res)
11
-      user.token = res
12
-      if (user.token) {
13
-        getUserInfo(user.token)
14
-      }
8
+  const getUserInfo = () => {
9
+    return gitee.getCurrentUser().then(res => {
10
+      Object.assign(user, res || {})
15
     })
11
     })
16
   }
12
   }
13
+
14
+  const signIn = (data) => {
15
+    return gitee.signIn(data).then(getUserInfo)
16
+  }
17
   
17
   
18
   const signOut = () => {
18
   const signOut = () => {
19
     // xxx
19
     // xxx
20
   }
20
   }
21
 
21
 
22
-  const getUserInfo = (token) => {
23
-    return request.get('/api/v5/user', { params: { access_token: token.access_token } }).then(res => {
24
-      Object.assign(user, res || {})
25
-    })
26
-  }
27
 
22
 
28
   // 快过期的需要刷新 token
23
   // 快过期的需要刷新 token
29
-  const refreshToken = (token) => {
24
+  const refreshToken = () => {
25
+    const token = getToken()
30
     const now = (new Date()).valueOf() / 1000
26
     const now = (new Date()).valueOf() / 1000
31
     const expire = token.expires_in + token.created_at
27
     const expire = token.expires_in + token.created_at
32
     const diff = 1 * 60 * 60 // 小时
28
     const diff = 1 * 60 * 60 // 小时
33
 
29
 
34
     if (now + diff > expire) {
30
     if (now + diff > expire) {
35
-      return request.post('/oauth/token', null, { params: { grant_type: 'refresh_token', refresh_token: token.refresh_token } }).then(res => {
36
-        setToken(res)
37
-        user.token = res
38
-      })
31
+      return gitee.refreshToken(token)
39
     }
32
     }
40
   }
33
   }
41
   
34
   
42
   const t = setTimeout(() => {
35
   const t = setTimeout(() => {
36
+    const token = getToken()
43
     clearTimeout(t)
37
     clearTimeout(t)
44
 
38
 
45
-    if (user.token) {
46
-      refreshToken(user.token)
47
-      // getUserInfo(user.token)
39
+    if (token) {
40
+      refreshToken()
48
     }
41
     }
49
   }, 0)
42
   }, 0)
50
 
43