Browse Source

example open dir

gaoshuaixing 5 years ago
parent
commit
2d27ec8c10

+ 23 - 6
app/controller/v1/example.js

@@ -6,13 +6,30 @@ class ExampleController extends BaseController {
 
   async openLocalDir() {
     const self = this;
-    const { service } = this;
+    const { ctx, service } = this;
+    const body = ctx.request.body;
+    const id = body.id;
+    const data = {};
+    let dir = '';
+    switch (id) {
+      case 'download' :
+        dir = 'C:/Users/Public/Downloads';
+        break;
+      case 'picture' :
+        dir = 'C:/Users/Public/Pictures';
+        break;    
+      case 'video' :
+        dir = 'C:/Users/Public/Videos';
+        break;
+      case 'doc' :
+        dir = 'C:/Users/Public/Documents';
+        break;      
+      case 'music' :
+        dir = 'C:/Users/Public/Music';
+        break;    
+    }
 
-    const data = {
-      title: 'example test'
-    };
-
-    await service.example.openLocalDir();
+    await service.example.openLocalDir(dir);
 
     self.sendSuccess(data);
   }

+ 2 - 2
app/service/example.js

@@ -3,10 +3,10 @@
 const BaseService = require('./base');
 
 class ExampleService extends BaseService {
-  async openLocalDir() {
+  async openLocalDir(dir) {
     const self = this;
 
-    await self.ipcCall('example.openDir');
+    await self.ipcCall('example.openDir', dir);
 
     return true;
   }

+ 2 - 0
frontend/package.json

@@ -9,7 +9,9 @@
   },
   "dependencies": {
     "ant-design-vue": "^1.7.2",
+    "axios": "^0.21.1",
     "core-js": "^3.6.5",
+    "store": "^2.0.12",
     "vue": "^2.6.11",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.4.9",

+ 31 - 0
frontend/src/api/main.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+// import storage from 'store'
+
+const mainApi = {
+  outApi: '/v1/outApi',
+  openDir: '/v1/example/openLocalDir'
+}
+
+/**
+ * outApi
+ */
+// export function outApi (parameter) {
+//   parameter.data.token = storage.get(ACCESS_TOKEN)
+//   parameter.data.uid = storage.get(USER_INFO) ? storage.get(USER_INFO).uid : ''
+//   return request({
+//     url: mainApi.outApi,
+//     method: 'post',
+//     data: parameter
+//   })
+// }
+
+/**
+ * openDir
+ */
+export function openDir (parameter) {
+  return request({
+    url: mainApi.openDir,
+    method: 'post',
+    data: parameter
+  })
+}

+ 30 - 19
frontend/src/config/router.config.js

@@ -3,22 +3,33 @@
  * @type { *[] }
  */
 export const constantRouterMap = [
-    {
-      path: '/testc',
-      component: { template: '<div><router-view /></div>' },
-      children: [
-        {
-          path: 'testc',
-          name: 'testc',
-          component: { template: '<div><h1>这是设置内一</h1></div>' }
-        },
-        {
-          path: '/testd',
-          name: 'testd',
-          component: { template: '<div><h1>这是设置内二</h1></div>' }
-        }
-      ]
-    },
-    { path: '/testa', component: () => import('@/views/Contenta') },
-    { path: '/testb', component: () => import('@/views/Contentb') }
-  ]
+  {
+    path: '/file',
+    component: { template: '<div><router-view /></div>' },
+    children: [
+      {
+        path: 'openDir',
+        name: 'FileOpenDir',
+        component: () => import('@/views/file/OpenDir')
+      }
+    ]
+  },
+  {
+    path: '/testc',
+    component: { template: '<div><router-view /></div>' },
+    children: [
+      {
+        path: 'testc',
+        name: 'testc',
+        component: { template: '<div><h1>这是设置内一</h1></div>' }
+      },
+      {
+        path: '/testd',
+        name: 'testd',
+        component: { template: '<div><h1>这是设置内二</h1></div>' }
+      }
+    ]
+  },
+  { path: '/testa', component: () => import('@/views/Contenta') },
+  { path: '/testb', component: () => import('@/views/Contentb') }
+]

+ 3 - 0
frontend/src/main.js

@@ -3,8 +3,11 @@ import antd from 'ant-design-vue';
 import 'ant-design-vue/dist/antd.css';
 import App from './App';
 import router from './router';
+import { VueAxios } from './utils/request'
 
 Vue.use(antd);
+// mount axios to `Vue.$http` and `this.$http`
+Vue.use(VueAxios)
 
 Vue.config.productionTip = false;
 

+ 35 - 0
frontend/src/utils/axios.js

@@ -0,0 +1,35 @@
+const VueAxios = {
+  vm: {},
+  // eslint-disable-next-line no-unused-vars
+  install (Vue, instance) {
+    if (this.installed) {
+      return
+    }
+    this.installed = true
+
+    if (!instance) {
+      // eslint-disable-next-line no-console
+      console.error('You have to install axios')
+      return
+    }
+
+    Vue.axios = instance
+
+    Object.defineProperties(Vue.prototype, {
+      axios: {
+        get: function get () {
+          return instance
+        }
+      },
+      $http: {
+        get: function get () {
+          return instance
+        }
+      }
+    })
+  }
+}
+
+export {
+  VueAxios
+}

+ 61 - 0
frontend/src/utils/request.js

@@ -0,0 +1,61 @@
+import axios from 'axios'
+import storage from 'store'
+import notification from 'ant-design-vue/es/notification'
+import { VueAxios } from './axios'
+
+// 创建 axios 实例
+const request = axios.create({
+  // API 请求的默认前缀
+  baseURL: 'http://localhost:7068/api',
+  timeout: 6000 // 请求超时时间
+})
+
+// 异常拦截处理器
+const errorHandler = (error) => {
+  if (error.response) {
+    const data = error.response.data
+    if (error.response.status === 403) {
+      notification.error({
+        message: 'Forbidden',
+        description: data.message
+      })
+    }
+    if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
+      notification.error({
+        message: 'Unauthorized',
+        description: 'Authorization verification failed'
+      })
+    }
+  }
+  return Promise.reject(error)
+}
+
+// request interceptor
+request.interceptors.request.use(config => {
+  const token = storage.get('token')
+  // 如果 token 存在
+  // 让每个请求携带自定义 token 请根据实际情况自行修改
+  if (token) {
+    config.headers['Access-Token'] = token
+  }
+  return config
+}, errorHandler)
+
+// response interceptor
+request.interceptors.response.use((response) => {
+  return response.data
+}, errorHandler)
+
+const installer = {
+  vm: {},
+  install (Vue) {
+    Vue.use(VueAxios, request)
+  }
+}
+
+export default request
+
+export {
+  installer as VueAxios,
+  request as axios
+}

+ 68 - 0
frontend/src/utils/util.js

@@ -0,0 +1,68 @@
+export function timeFix () {
+  const time = new Date()
+  const hour = time.getHours()
+  return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好'
+}
+
+export function welcome () {
+  const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了']
+  const index = Math.floor(Math.random() * arr.length)
+  return arr[index]
+}
+
+/**
+ * 触发 window.resize
+ */
+export function triggerWindowResizeEvent () {
+  const event = document.createEvent('HTMLEvents')
+  event.initEvent('resize', true, true)
+  event.eventType = 'message'
+  window.dispatchEvent(event)
+}
+
+export function handleScrollHeader (callback) {
+  let timer = 0
+
+  let beforeScrollTop = window.pageYOffset
+  callback = callback || function () {}
+  window.addEventListener(
+    'scroll',
+    event => {
+      clearTimeout(timer)
+      timer = setTimeout(() => {
+        let direction = 'up'
+        const afterScrollTop = window.pageYOffset
+        const delta = afterScrollTop - beforeScrollTop
+        if (delta === 0) {
+          return false
+        }
+        direction = delta > 0 ? 'down' : 'up'
+        callback(direction)
+        beforeScrollTop = afterScrollTop
+      }, 50)
+    },
+    false
+  )
+}
+
+export function isIE () {
+  const bw = window.navigator.userAgent
+  const compare = (s) => bw.indexOf(s) >= 0
+  const ie11 = (() => 'ActiveXObject' in window)()
+  return compare('MSIE') || ie11
+}
+
+/**
+ * Remove loading animate
+ * @param id parent element id or class
+ * @param timeout
+ */
+export function removeLoadingAnimate (id = '', timeout = 1500) {
+  if (id === '') {
+    return
+  }
+  setTimeout(() => {
+    document.body.removeChild(document.getElementById(id))
+  }, timeout)
+}
+  

+ 3 - 7
frontend/src/views/Layout.vue

@@ -55,13 +55,9 @@ export default {
       subMenuList: {
         'menu_1' : {
           'subMenu_1' : {
-            title: '首页菜单1',
-            page: '/testa'
-          },
-          'subMenu_2' : {
-            title: '首页菜单2',
-            page: '/testb'
-          },
+            title: '打开文件夹',
+            page: '/file/openDir'
+          }
         },
         'menu_2' : {
           'subMenu_1' : {

+ 66 - 0
frontend/src/views/file/OpenDir.vue

@@ -0,0 +1,66 @@
+<template>
+  <div>
+    <h3 :style="{ marginBottom: '16px' }">
+      demo 打开文件夹实现
+    </h3>
+    <a-list bordered :data-source="data">
+      <a-list-item @click="openDirectry(item.id)" slot="renderItem" slot-scope="item">
+        {{ item.content }}
+        <a-button type="link">
+          打开
+        </a-button>
+      </a-list-item>
+    </a-list>
+  </div>
+</template>
+<script>
+import { openDir } from '@/api/main'
+
+const data = [
+  {
+    content: '【下载】目录',
+    id: 'download'
+  },
+  {
+    content: '【图片】目录',
+    id: 'picture'
+  },
+  {
+    content: '【视频】目录',
+    id: 'video'
+  },
+  {
+    content: '【文档】目录',
+    id: 'doc'
+  },
+  {
+    content: '【音乐】目录',
+    id: 'music'
+  }
+];
+
+export default {
+  data() {
+    return {
+      data,
+    };
+  },
+  methods: {
+    openDirectry (id) {
+      console.log('id:', id)
+      const params = {
+        'id': id
+      }
+      openDir(params).then(res => {
+        if (res.code !== 0) {
+          return false
+        }
+
+        }).catch(err => {
+          console.log('err:', err)
+        })
+    },
+  }
+};
+</script>
+<style></style>