scorpio 3 years ago
parent
commit
b46cdc8d1d

+ 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')
+  }
 }

+ 29 - 27
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
@@ -27,7 +27,7 @@
               <vue-qr :currentLevel='3' :logoCornerRadius='4' :logoScale='0.25' :logoSrc='logoSrc' :text='qrCodeText'
                       size='340'/>
             </div>
-            <span class='mt-10 bold main-color font-16'>打开微信扫描二维码登梧桐树云平台</span>
+            <span class='mt-10 bold main-color font-16'>打开微信扫描二维码登梧桐树云平台</span>
           </div>
 
           <div v-else class='padding-20 flex flex-col flex-center mt-20'>
@@ -107,17 +107,17 @@ layout: 'empty',
 
 <script>
 import md5 from 'js-md5'
-import {useStore} from '@/store/user.js'
-import {removeToken, setToken} from '../utils/auth.js'
+import { useStore } from '@/store/user.js'
+import { removeToken, setToken } from '../utils/auth.js'
 import permissionStore from '@/store/permission.js'
 import VueQr from 'vue-qr/src/packages/vue-qr.vue'
 
 export default {
   name: 'login',
-  components: {VueQr},
+  components: { VueQr },
   watch: {
     qrCodeLogin: {
-      handler(val) {
+      handler (val) {
         if (val) {
           this.qrCode()
           this.checkLogin()
@@ -126,12 +126,12 @@ export default {
       immediate: true
     }
   },
-  setup() {
+  setup () {
     const user = useStore()
     const permission = permissionStore()
-    return {user, permission}
+    return { user, permission }
   },
-  data() {
+  data () {
     return {
       flag: false,
       form: {
@@ -140,16 +140,16 @@ export default {
       },
       rules: {
         name: [
-          {required: true, message: '请输入手机号码', trigger: 'blur'},
-          {min: 11, max: 11, message: '请输入11位手机号', trigger: 'blur'}
+          { required: true, message: '请输入手机号码', trigger: 'blur' },
+          { min: 11, max: 11, message: '请输入11位手机号', trigger: 'blur' }
         ],
         pass: [
-          {required: true, message: '请输入密码', trigger: 'blur'},
-          {min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur'}
+          { required: true, message: '请输入密码', trigger: 'blur' },
+          { min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur' }
         ],
         code: [
-          {required: true, message: '请输入验证码', trigger: 'blur'},
-          {min: 5, max: 5, message: '验证码不正确', trigger: 'blur'}
+          { required: true, message: '请输入验证码', trigger: 'blur' },
+          { min: 5, max: 5, message: '验证码不正确', trigger: 'blur' }
         ]
       },
       code: '',
@@ -161,22 +161,22 @@ export default {
       logoSrc: new URL('../assets/img/logo.png', import.meta.url).href
     }
   },
-  created() {
+  created () {
     this.permission.cleanPermission()
     removeToken()
     this.init()
   },
-  unmounted() {
+  unmounted () {
     clearInterval(this.time)
   },
   methods: {
-    init() {
+    init () {
       this.$api.login.captcha().then(res => {
         this.code = res.image
         this.header = res.key
       })
     },
-    submint() {
+    submint () {
       this.$refs.loginForm.validate((res) => {
         if (res) {
           const params = {
@@ -187,7 +187,7 @@ export default {
             scope: 'all',
             type: 'account'
           }
-          const header = {captchaKey: this.header, captchaCode: this.form.code}
+          const header = { captchaKey: this.header, captchaCode: this.form.code }
           this.$api.login.login(params, header).then(res => {
             if (res.error_description) {
               this.$message.error(res.error_description)
@@ -203,11 +203,11 @@ export default {
         }
       })
     },
-    loginAdmin() {
+    loginAdmin () {
       this.form.name = 'admin'
       this.form.pass = 'admin'
     },
-    getInfo() {
+    getInfo () {
       this.getPermission()
       this.$api.login.getUserInfo().then(res => {
         if (res.code === 200) {
@@ -221,14 +221,14 @@ export default {
         }
       })
     },
-    getPermission() {
+    getPermission () {
       this.$api.login.getPermission().then(res => {
         if (res.code === 200) {
           this.permission.addPermission(res.data)
         }
       })
     },
-    checkLogin() {
+    checkLogin () {
       let count = 0
       this.time = setInterval(() => {
         count = count + 1
@@ -246,7 +246,7 @@ export default {
         }
       }, 1000)
     },
-    qrCode() {
+    qrCode () {
       this.$api.login.qrCode().then(res => {
         if (res.code === 200) {
           this.sessionId = res.data
@@ -254,8 +254,8 @@ export default {
         }
       })
     },
-    codeLogin() {
-      this.$api.login.qrCodeLogin({sessionId: this.sessionId}).then(res => {
+    codeLogin () {
+      this.$api.login.qrCodeLogin({ sessionId: this.sessionId }).then(res => {
         if (res.code === 200) {
           const tmp = res.data
           console.log(Object.prototype.hasOwnProperty.call(tmp, 'phone'))
@@ -272,6 +272,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('/')
@@ -291,6 +292,7 @@ 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)
+        }
+      })
     }
   }
 }

+ 19 - 2
src/views/home/component/files_list.vue

@@ -35,6 +35,12 @@
       <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>
 
@@ -86,15 +92,26 @@ export default {
   },
   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,

+ 73 - 13
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>
 
@@ -113,7 +136,10 @@ export default {
         ownerId: '',
         projectId: ''
       },
-      userInfo: null
+      userInfo: null,
+      applyShow: false,
+      currentFolder: null,
+      applyTime: []
     }
   },
   created () {
@@ -124,7 +150,7 @@ export default {
       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({
@@ -154,6 +180,10 @@ export default {
           })
         })
     },
+    folderApply (item) {
+      this.currentFolder = item
+      this.applyShow = true
+    },
     success (res) {
       this.fileList = res.fileList.map(res => {
         const item = {}
@@ -170,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)
         }
@@ -195,7 +227,14 @@ export default {
           this.$bus.emit('reFolder')
           this.$message.success(res.msg)
           if (this.user.info.type !== 3) {
-            this.sendMsg = true
+            this.$confirm('文件上传成功,是否给业主发送提醒消息?', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            })
+              .then(() => {
+                this.SendMsg()
+              })
           }
         } else {
           this.show = false
@@ -236,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)
+        }
+      })
     }
   }
 }