scorpioyq 3 ani în urmă
părinte
comite
75f3c2add0

+ 75 - 68
src/api/project/index.js

@@ -1,82 +1,89 @@
-import fetch from "../fetch.js";
+import fetch from '../fetch.js'
 
 export default {
-    /**
+  /**
      * 项目相关借口
      * @returns {Promise<unknown>}
      */
-    projectList(params) { //项目列表
-        return fetch('/blade-project-manage/project/v1/page', params)
-    },
-    projectAdd(params) { //新增项目
-        return fetch('/blade-project-manage/project/v1/save', params, 'post', 'json')
-    },
-    projectRemove(params) { //删除项目
-        return fetch('/blade-project-manage/project/v1/remove', params, 'post')
-    },
-    typeList() { //项目分类列表
-        return fetch('/blade-project-manage/projecttype/v1/list')
-    },
-    projectInfo(id) { //项目详细信息
-        return fetch('/blade-project-manage/project/v1/detail/' + id)
-    },
-    proUpdate(params) {//项目信息更新
-        return fetch('/blade-project-manage/project/v1/update', params, 'post', 'json')
-    },
-    issuanceDetail(params) { //项目发行明细
-        return fetch('/blade-project-manage/projectdetail/v1/list', params)
-    },
-    issueAdd(params) {//新增发行明细
-        return fetch('/blade-project-manage/projectdetail/v1/save', params, 'post', 'json')
-    },
-    userStageList() { //统计用户阶段项目数
-        return fetch('/blade-project-manage/stage/v1/countProjectStagelist')
-    },
-    includeStage(params) { //单个项目包含阶段
-        return fetch('/blade-project-manage/projectstage/v1/getProjectStageList', params)
-    },
-    folderList(params) { //阶段包含文件夹列表
-        return fetch('/blade-project-manage/projectstagefilefolder/v1/getProjectStageFileList', params)
-    },
-    folderListAll(params) { //历史数据文件夹列表
-        return fetch('/blade-project-manage/filefolder/v1/list', params)
-    },
-    folderRemove(params) { //删除文件夹
-        return fetch('/blade-project-manage/filefolder/v1/remove', params, 'post')
-    },
-    folderAdd(params) { //添加文件夹
-        return fetch('/blade-project-manage/filefolder/v1/save', params, 'post', 'json')
-    },
-    fileList(params) { //文件夹里包含文件列表
-        return fetch('/blade-project-manage/bladefile/v1/getListByFolderId', params)
-    },
-    fileDetail(id) {
-        return fetch('/wutong-library/library/detail/' + id)
-    },
-    articleDetailByFile(id) {
-        return fetch('/wutong-library/library/detail/file/' + id)
-    },
-    fileAdd(params) { //上传(新增)文件
-        return fetch('/blade-project-manage/bladefile/v1/save', params, 'post', 'json')
-    },
-    fileRemove(params) { //删除文件
-        return fetch('/blade-project-manage/bladefile/v1/remove', params, 'post')
-    },
-    /**
+  projectList (params) { // 项目列表
+    return fetch('/blade-project-manage/project/v1/page', params)
+  },
+  projectAdd (params) { // 新增项目
+    return fetch('/blade-project-manage/project/v1/save', params, 'post', 'json')
+  },
+  projectRemove (params) { // 删除项目
+    return fetch('/blade-project-manage/project/v1/remove', params, 'post')
+  },
+  typeList () { // 项目分类列表
+    return fetch('/blade-project-manage/projecttype/v1/list')
+  },
+  projectInfo (id) { // 项目详细信息
+    return fetch('/blade-project-manage/project/v1/detail/' + id)
+  },
+  proUpdate (params) { // 项目信息更新
+    return fetch('/blade-project-manage/project/v1/update', params, 'post', 'json')
+  },
+  issuanceDetail (params) { // 项目发行明细
+    return fetch('/blade-project-manage/projectdetail/v1/list', params)
+  },
+  issueAdd (params) { // 新增发行明细
+    return fetch('/blade-project-manage/projectdetail/v1/save', params, 'post', 'json')
+  },
+  userStageList () { // 统计用户阶段项目数
+    return fetch('/blade-project-manage/stage/v1/countProjectStagelist')
+  },
+  includeStage (params) { // 单个项目包含阶段
+    return fetch('/blade-project-manage/projectstage/v1/getProjectStageList', params)
+  },
+  folderList (params) { // 阶段包含文件夹列表
+    return fetch('/blade-project-manage/projectstagefilefolder/v1/getProjectStageFileList', params)
+  },
+  folderListAll (params) { // 历史数据文件夹列表
+    return fetch('/blade-project-manage/filefolder/v1/list', params)
+  },
+  folderRemove (params) { // 删除文件夹
+    return fetch('/blade-project-manage/filefolder/v1/remove', params, 'post')
+  },
+  folderAdd (params) { // 添加文件夹
+    return fetch('/blade-project-manage/filefolder/v1/save', params, 'post', 'json')
+  },
+  fileList (params) { // 文件夹里包含文件列表
+    return fetch('/blade-project-manage/bladefile/v1/getListByFolderId', params)
+  },
+  fileDetail (id) {
+    return fetch('/wutong-library/library/detail/' + id)
+  },
+  articleDetailByFile (id) {
+    return fetch('/wutong-library/library/detail/file/' + id)
+  },
+  fileAdd (params) { // 上传(新增)文件
+    return fetch('/blade-project-manage/bladefile/v1/save', params, 'post', 'json')
+  },
+  fileRemove (params) { // 删除文件
+    return fetch('/blade-project-manage/bladefile/v1/remove', params, 'post')
+  },
+  /**
      * 业主主动授权
      * @param params
      * @returns {Promise | Promise<unknown>}
      */
-    initCode(params) {
-        return fetch('/blade-project-manage/qrcode/v1/getGrantQrcode', params, 'post', 'json')
-    },
-    /**
+  initCode (params) {
+    return fetch('/blade-project-manage/qrcode/v1/getGrantQrcode', params, 'post', 'json')
+  },
+  /**
      * 服务商触发消息发送
      * @param params
      * @returns {Promise | Promise<unknown>}
      */
-    send(params) {
-        return fetch('/blade-project-manage/frontMessage/v1/sendMessage', params)
-    }
-
+  send (params) {
+    return fetch('/blade-project-manage/frontMessage/v1/sendMessage', params)
+  },
+  /**
+     * 服务商主动申请文件授权
+     * @param params
+     * @returns {Promise<unknown>}
+     */
+  apply (params) {
+    return fetch('/blade-project-manage/grant/v1/applyGrant', params, 'post', 'json')
+  }
 }

+ 4 - 2
src/page/login.vue

@@ -1,6 +1,6 @@
 <template>
   <div class='full-screen flex flex-center bg'>
-    <div class='login white-bg radius '>
+    <div class='login white-bg radius'>
       <div class='flex flex-center flex-child-average'>
         <div class='flex left '>
           <img
@@ -29,7 +29,6 @@
               </div>
               <span class='mt-10 bold main-color font-16' style="margin-top: -20px">打开微信扫描二维码登陆梧桐树云平台</span>
             </div>
-
             <div v-else class=' flex flex-col flex-center'>
               <span class='font-24 black bold'>欢迎来到梧桐树云平台👏</span>
               <div class="flex flex-col flex-center mt-5" style="width: 450px;height: 400px">
@@ -274,6 +273,7 @@ export default {
               if (res.error_description) {
                 this.$message.error(res.error_description)
               } else {
+                clearInterval(this.time)
                 setToken(res.access_token)
                 this.getInfo()
                 this.$router.replace('/')
@@ -293,6 +293,8 @@ export default {
 }
 
 .login {
+  box-shadow: 5px 10px 10px 5px rgba(0, 0, 0, 0.28);
+
   .left {
     height: auto;
     width: 560;

+ 47 - 8
src/views/home/component/current.vue

@@ -5,7 +5,7 @@
         <span>当前数据({{ data.total }})</span>
       </div>
       <div class="flex flex-center flex-child-average flex-justify-end" style="margin-right: 50px">
-        <base-button class="mr-20" icon="User" title="授权查看" type="0" @click='showClick'/>
+        <base-button  v-if='permissions.permissions.home_folder_authorize' class="mr-20" icon="User" title="授权" type="0" @click='showClick'/>
         <base-button icon="Upload" title="上传文件" @click="show = true"/>
       </div>
     </div>
@@ -14,7 +14,7 @@
                append-to-body
                center
                title="附件上传(可批量)">
-      <uploadFile :data='{type:1,toStatus:0}' :max='20' accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.ppt,.wps"
+      <uploadFile :data='{type:1,toStatus:0}' :max='20'
                   @close='show = false'
                   @success='success'/>
     </el-dialog>
@@ -40,6 +40,8 @@ import filesList from './files_list.vue'
 import baseButton from '../../../components/base-button.vue'
 import uploadFile from '../../../components/upload-file.vue'
 import authorize from '@/views/home/component/authorize.vue'
+import permissionStore from '@/store/permission.js'
+import { useStore } from '@/store/user.js'
 export default {
   name: 'current',
   components: { filesList, baseButton, uploadFile, authorize },
@@ -54,11 +56,22 @@ export default {
       fileList: [],
       saveCount: 0,
       libraryList: [],
-      projectId: ''
+      projectId: '',
+      sendParams: {
+        ids: '',
+        ownerId: '',
+        projectId: ''
+      }
     }
   },
+  setup () {
+    const permissions = permissionStore()
+    const user = useStore()
+    return { permissions, user }
+  },
   created () {
     this.projectId = this.$route.query.projectId
+    this.sendParams.ownerId = this.$route.query.ownerId
   },
   methods: {
     showClick () {
@@ -76,7 +89,14 @@ export default {
         return item
       })
       this.fileList.forEach(sub => {
-        this.saveLibrary(sub)
+        this.saveCount++
+        if (['pdf', 'doc'].includes(sub.suffix)) {
+          this.saveLibrary(sub)
+        }
+        if (this.saveCount === this.fileList.length) {
+          this.saveCount = 0
+          this.addFile()
+        }
       })
     },
     saveLibrary (sub) {
@@ -85,10 +105,6 @@ export default {
         if (res.code === 200) {
           this.saveCount++
           this.libraryList.push(res.data.id)
-          if (this.saveCount === this.fileList.length) {
-            this.saveCount = 0
-            this.addFile()
-          }
         } else {
           this.$message.error(res.msg)
         }
@@ -100,11 +116,34 @@ export default {
           this.show = false
           this.$emit('reFiles')
           this.$message.success(res.msg)
+          if (this.user.info.type !== 3) {
+            this.$confirm('文件上传成功,是否给业主发送提醒消息?', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            })
+              .then(() => {
+                this.SendMsg()
+              })
+          }
         } else {
           this.show = false
           this.$message.error(res.msg)
         }
       })
+    },
+    SendMsg () {
+      this.sendParams.ids = this.fileList.map(e => e.fileId).join(',')
+      this.sendParams.projectId = this.projectId
+      this.$api.project.send(this.sendParams).then(res => {
+        if (res.code === 200) {
+          this.$message.success('消息已经发送成功!')
+          this.$bus.emit('reFolder')
+          this.sendMsg = false
+        } else {
+          this.$message.error(res.msg)
+        }
+      })
     }
   }
 }

+ 1 - 1
src/views/home/component/dash.vue

@@ -15,7 +15,7 @@
           <span class="ml-15 sp1 mt-5">{{ item.projectNumber }}<span class="grey font-14 ml-5">个</span></span>
         </div>
       </div>
-      <base-button class="ml-20 mt-20" icon="Plus" title="新增" @click="showAdd = true"/>
+      <base-button v-if='permissions.permissions.projectAdd' class="ml-20 mt-20" icon="Plus" title="新增" @click="showAdd = true"/>
     </div>
     <avue-crud ref="crud"
                v-model="form"

+ 40 - 6
src/views/home/component/files_list.vue

@@ -25,8 +25,8 @@
         <div class="flex flex-center" style="flex: 3">
           <main-button icon="View" title="详情" width="85" @click="View(item)"/>
           <main-button icon="Download" title="下载" width="85" @click="downFile(item)"/>
-          <main-button icon="UploadFilled" title="同步" width="85"/>
-          <main-button icon="Delete" title="删除" width="85" @click="removeFile(item)"/>
+          <!--          <main-button icon="UploadFilled" title="同步" width="85"/>-->
+          <main-button v-if='item.del' icon="Delete" title="删除" width="85" @click="removeFile(item)"/>
         </div>
       </div>
     </div>
@@ -35,12 +35,20 @@
       <span class="mr-20">共{{ data.total }}条</span>
       <el-pagination :total="data.total" background layout="prev, pager, next"/>
     </div>
+
+    <el-image-viewer
+        v-if='showImage'
+        :url-list="imgList"
+        @close='viewerClose'
+    />
   </div>
 </template>
 
 <script>
 import mainButton from '../../../components/main-button.vue'
-import {bytesToSize} from '../../../utils/tools.js'
+import {bytesToSize} from '@/utils/tools.js'
+import {useStore} from '@/store/user.js'
+import permissionStore from '@/store/permission.js'
 
 export default {
   name: 'files_list',
@@ -58,26 +66,52 @@ export default {
         this.files.map(e => {
           if (e.volume === '') {
             e.size = 0
-            return
           }
           e.size = bytesToSize(e.volume)
+          if (this.user.info.type === 3) {
+            // 业主可以任意删除操作
+            e.del = true
+          } else {
+            // 服务商上传的文件可以自行删除
+            if (e.createUser === this.user.info.bladeUserId) {
+              e.del = true
+            } else {
+              e.del = false
+            }
+          }
           return e
         })
       },
       immediate: true
     }
   },
+  setup() {
+    const user = useStore()
+    const permission = permissionStore()
+    return {user, permission}
+  },
   data() {
     return {
-      files: []
+      files: [],
+      showImage: false,
+      imgList: []
     }
   },
   methods: {
     View(item) {
+      if (['png', 'jpg'].includes(item.suffix)) {
+        this.showImage = true
+        this.imgList.push(item.url)
+        return
+      }
       this.$router.push('/home/file_detail?id=' + item.fileId)
     },
     downFile(item) {
-      window.open('/api/wutong-file/minio/file/downFile/' + item.dowloadFileId, '')
+      window.open(item.url, '')
+    },
+    viewerClose() {
+      this.showImage = false
+      this.imgList = []
     },
     removeFile(item) {
       this.$confirm('确认是否删除该文件?', {

+ 8 - 3
src/views/home/component/folder_info.vue

@@ -27,8 +27,8 @@
         </div>
       </div>
       <div class="flex flex-center mr-5 " style="flex: 1.2">
-        <base-button icon="Plus" title="添加文件夹" type="0" @click="addShow = true"/>
-        <base-button class="ml-10" icon="User" title="批量授权"/>
+        <base-button v-if='permissions.permissions.home_folder_new' icon="Plus" title="添加文件夹" type="0" @click="addShow = true"/>
+        <base-button v-if='permissions.permissions.home_folders_apply' class="ml-10" icon="User" title="批量授权"/>
       </div>
     </div>
     <div class="mt-20">
@@ -74,7 +74,8 @@
 <script>
 import baseButton from '../../../components/base-button.vue'
 import folderList from './folder_list.vue'
-import authorize from '@/views/home/component/authorize.vue'
+import permissionStore from '@/store/permission.js'
+import { useStore } from '@/store/user.js'
 
 export default {
   name: 'right2',
@@ -97,6 +98,10 @@ export default {
       immediate: true
     }
   },
+  setup () {
+    const permissions = permissionStore()
+    return { permissions }
+  },
   data () {
     return {
       addShow: false,

+ 82 - 14
src/views/home/component/folder_list.vue

@@ -18,10 +18,10 @@
         <span style="flex: 1">{{ item.updateTime }}</span>
         <span style="flex: 1.5">{{ item.fileNumber }}</span>
         <div class="flex flex-center" style="flex: 3">
-          <main-button icon="View" title="详情" width="85" @click="fileView(item)"/>
-          <main-button v-if='permissions.permissions.home_folder_add' icon="Upload" title="上传文件" width="85" @click="uploadFiles(item)"/>
+          <main-button v-if='[1,2].includes(item.isAccess)' icon="View" title="详情" width="85" @click="fileView(item)"/>
+          <main-button v-if='permissions.permissions.home_folder_add  && item.isAccess === 2 ' icon="Upload" title="上传文件" width="85" @click="uploadFiles(item)"/>
           <main-button v-if="permissions.permissions.home_folder_authorize" icon="Pointer" title="授权操作" width="85" @click='getFileList(item)'/>
-          <main-button v-if="permissions.permissions.home_folder_apply" icon="Delete" title="授权申请" width="85" @click="folderRemove(item)"/>
+          <main-button v-if="permissions.permissions.home_folder_apply" icon="Position" title="授权申请" width="85" @click="folderApply(item)"/>
           <main-button v-if="permissions.permissions.home_folder_del" icon="Delete" title="删除" width="85" @click="folderRemove(item)"/>
         </div>
       </div>
@@ -36,7 +36,7 @@
                append-to-body
                center
                title="附件上传(可批量)">
-      <uploadFile :data='{type:1,toStatus:0}' :max='20' accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.ppt,.wps"
+      <uploadFile :data='{type:1,toStatus:0}' :max='20'
                   @close='show = false'
                   @success='success'/>
     </el-dialog>
@@ -63,6 +63,29 @@
         </div>
       </div>
     </el-dialog>
+<!--    申请授权-->
+    <el-dialog title='申请授权' v-model='applyShow' width='30%'>
+      <div class='full-width flex flex-center flex-col'>
+        <text class='full-width black text-left font-14 bold'>确认向业主申请{{currentFolder.folderName}}的管理权限?</text>
+        <div class='full-width flex flex-align-center mt-20'>
+          <span class='font-14 bold'>授权时长</span>
+          <el-date-picker
+              v-model="applyTime"
+              class='ml-20'
+              end-placeholder="截止日期"
+              range-separator="至"
+              start-placeholder="开始日期"
+              type="daterange"
+              value-format='YYYY-MM-DD'
+          />
+        </div>
+        <el-divider/>
+        <div class='full-width flex flex-center'>
+          <el-button type='danger' plain>取 消</el-button>
+          <el-button type='primary' @click='submit' >确 定</el-button>
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -71,13 +94,15 @@ import mainButton from '../../../components/main-button.vue'
 import uploadFile from '../../../components/upload-file.vue'
 import authorize from '@/views/home/component/authorize.vue'
 import permissionStore from '@/store/permission.js'
+import { useStore } from '@/store/user.js'
 
 export default {
   name: 'file_list',
   components: { mainButton, uploadFile, authorize },
   setup () {
     const permissions = permissionStore()
-    return { permissions }
+    const user = useStore()
+    return { permissions, user }
   },
   props: {
     folder: Array,
@@ -110,15 +135,22 @@ export default {
         ids: '',
         ownerId: '',
         projectId: ''
-      }
+      },
+      userInfo: null,
+      applyShow: false,
+      currentFolder: null,
+      applyTime: []
     }
+  },
+  created () {
+
   },
   methods: {
     fileView (item) {
       if (this.type === 0) {
         this.$router.push({
           path: '/home/files',
-          query: { id: item.fileFolderId, projectId: this.projectId }
+          query: { id: item.fileFolderId, projectId: this.projectId, ownerId: this.ownerId }
         })
       } else {
         this.$router.push({
@@ -148,6 +180,10 @@ export default {
           })
         })
     },
+    folderApply (item) {
+      this.currentFolder = item
+      this.applyShow = true
+    },
     success (res) {
       this.fileList = res.fileList.map(res => {
         const item = {}
@@ -164,19 +200,21 @@ export default {
         return item
       })
       this.fileList.forEach(sub => {
-        this.saveLibrary(sub)
+        this.saveCount++
+        if (['pdf', 'doc'].includes(sub.suffix)) {
+          this.saveLibrary(sub)
+        }
+        if (this.saveCount === this.fileList.length) {
+          this.saveCount = 0
+          this.addFile()
+        }
       })
     },
     saveLibrary (sub) {
       const data = { category: 4, content: '' }
       this.$api.common.submit(Object.assign(sub, data)).then(res => {
         if (res.code === 200) {
-          this.saveCount++
           this.libraryList.push(res.data.id)
-          if (this.saveCount === this.fileList.length) {
-            this.saveCount = 0
-            this.addFile()
-          }
         } else {
           this.$message.error(res.msg)
         }
@@ -188,7 +226,16 @@ export default {
           this.show = false
           this.$bus.emit('reFolder')
           this.$message.success(res.msg)
-          this.sendMsg = true
+          if (this.user.info.type !== 3) {
+            this.$confirm('文件上传成功,是否给业主发送提醒消息?', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            })
+              .then(() => {
+                this.SendMsg()
+              })
+          }
         } else {
           this.show = false
           this.$message.error(res.msg)
@@ -228,6 +275,27 @@ export default {
 
     change (res) {
       this.fileData[res.index] = res
+    },
+    submit () {
+      if (this.applyTime.length !== 2) {
+        this.$message.error('请选择授权时间')
+        return
+      }
+      const tmp = { projectId: this.projectId, ownerId: this.ownerId }
+      const item = { startTime: this.applyTime[0], endTime: this.applyTime[1], folderId: this.currentFolder.fileFolderId }
+      const list = [item]
+      this.$api.project.apply(Object.assign(tmp, { folders: list })).then(res => {
+        if (res.code === 200) {
+          this.applyShow = false
+          this.$confirm(res.data, {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          })
+        } else {
+          this.$message.error(res.msg)
+        }
+      })
     }
   }
 }