diff --git a/src/api/doc/type.ts b/src/api/doc/type.ts index 1ae85eb..b7ae54c 100644 --- a/src/api/doc/type.ts +++ b/src/api/doc/type.ts @@ -15,6 +15,7 @@ export interface matterPage{ deleted?:boolean; orderDir?:string; name?:string; + space?:string; orderCreateTime?:string; } @@ -31,8 +32,14 @@ export interface matterInfo{ deleted?:boolean; expireInfinity?:boolean; expireTime?:string; + permitVal?:number; //该值是当前用户permits的解析结果 + permits?:matterPermit; +} +export interface matterPermit{ + id:number; + MatterUuid:string; + data:string; } - export interface shareItem{ name?:string; updateTime?:string; @@ -47,6 +54,7 @@ export interface shareItem{ } export interface matterTree extends matterInfo { + manager?:boolean; children:matterTree[] } @@ -55,9 +63,10 @@ export type matterTreeList = PageResult export type matterResutList = PageResult export interface createDir{ - userUuid:string; + userUuid?:string; puuid:string; name:string; + space?:string; } export interface createShare{ diff --git a/src/api/hr/people/share_ctrol.ts b/src/api/hr/people/share_ctrol.ts index febfdd3..3cc1c9f 100644 --- a/src/api/hr/people/share_ctrol.ts +++ b/src/api/hr/people/share_ctrol.ts @@ -74,7 +74,12 @@ export function getPermitedList(uid:string,data:{uuid:string}): AxiosPromise<{pe /** * 获取空间成员列表 */ -export function getSpaceMemberList(uid:string,data:{space?:string}): AxiosPromise<{members:string[],dprts:string[]}> { +export function getSpaceMemberList(uid:string,data:{space?:string,matter:string}): AxiosPromise<{ + members:string[], + dprts:string[], + managers:string, + permits:Object, +}> { return request({ url: '/hxpan/api/space/members', method: 'post', @@ -86,6 +91,50 @@ export function getSpaceMemberList(uid:string,data:{space?:string}): AxiosPromis }); } +/** + * 添加空间管理员 + */ +export function addSpaceManager(uid:string,data:{space:string,mangers:string}): AxiosPromise<{members:string[],dprts:string[]}> { + return request({ + url: '/hxpan/api/space/addmanagers', + method: 'post', + headers: { + 'Identifier':uid, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data + }); +} + +/** + * 更新matter权限 + */ +export function updateSpaceMetterPermit(uid:string,data:{space:string,matter:string,permits:Object}): AxiosPromise<{members:string[],dprts:string[]}> { + return request({ + url: '/hxpan/api/space/permit/update', + method: 'post', + headers: { + 'Identifier':uid, + }, + data: data + }); +} + +/** + * 重置matter特定权限 + */ +export function resetSpaceMatterPermit(uid:string,data:{space:string,matter:string}): AxiosPromise<{members:string[],dprts:string[]}> { + return request({ + url: '/hxpan/api/space/permit/reset', + method: 'post', + headers: { + 'Identifier':uid, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data + }); +} + /** * 保存文档成员权限修改 */ diff --git a/src/store/modules/orgMember.ts b/src/store/modules/orgMember.ts new file mode 100644 index 0000000..5cc4dc1 --- /dev/null +++ b/src/store/modules/orgMember.ts @@ -0,0 +1,36 @@ +import { defineStore } from 'pinia' +import { ref} from 'vue'; +import request from "@/utils/request"; + +export const useOrgMemberStore = defineStore('orgMember', () => { + interface OrgMemberItem { + id: string; + label: string; + children?:OrgMemberItem[]; + } + + const listMap = ref>({}) + const dataTree = ref({ id: '', label: '', children: [] }) + + async function init() { + await request({ + url: "/javasys/lowCode/transfer/getOrgAndManTree", + method: "post", + }).then((response) => { + // assuming response.data is an array of OrgMemberItem + dataTree.value=response.data + handleChildren(response.data.children) + }); + } + + function handleChildren(childs:any[]){ + childs.forEach(item => { + listMap.value[item.id] = item.label; + if(item.children){ + handleChildren(item.children) + } + }); + } + init() + return { listMap,dataTree } +}) \ No newline at end of file diff --git a/src/views/doc/agent.vue b/src/views/doc/agent.vue index 9a31a00..6952b09 100644 --- a/src/views/doc/agent.vue +++ b/src/views/doc/agent.vue @@ -230,7 +230,7 @@ onMounted(() => {
-

恒信高科AI平台

+

恒信高科AI平台

{{ mod.name }} @@ -288,7 +288,7 @@ onMounted(() => { align-self: start; line-height: 30px; margin: 20px 33px; - font-size: 18px; + font-size: 16px; color: black; } .dynamic-width-message-box-byme .el-message-box__message{ diff --git a/src/views/doc/manage.vue b/src/views/doc/manage.vue index 1441dbd..1392f46 100644 --- a/src/views/doc/manage.vue +++ b/src/views/doc/manage.vue @@ -8,26 +8,22 @@ import { getExpirTime, getFileIcon, readableSize,fileType} from "./tools" import sharePermission from './sharePermission.vue'; import { useUserStore } from "@/store/modules/user"; import { getMatterList,postCreateDir,postDelMatter,postCreateShare,postMatterRename,postDelMatBatch,getMySpaces,doCreateSpace} from "@/api/doc/index" -import { matterPage,matterInfo,respCreateShare,matterTree, doFileUpload} from "@/api/doc/type" +import { matterPage,matterInfo,respCreateShare,matterTree, doFileUpload,matterPermit} from "@/api/doc/type" import { h } from 'vue' +import router from "@/router"; import { - Delete, - View, - Download, - Share, - Search, - Edit, - Promotion, - Folder, - Avatar, - Plus, - Grid, - List, + Delete,View,Download,Share,Search,Edit, + Avatar,Plus,Grid,List, + Setting, } from '@element-plus/icons-vue' -import {ElSelect,ElOption, ElText,ElInput,TableInstance,ElMessage,UploadFile,UploadFiles,ElPagination,ElTree,TreeNode} from "element-plus"; +import {ElSelect,ElOption, ElText,ElInput,TableInstance,ElMessage,UploadFile, + UploadFiles,ElPagination,ElTree,TreeNode,ElDropdown,ElDropdownItem} from "element-plus"; import preview from './preview.vue'; import space from './space.vue'; +import spacePermission from './spacePermission.vue'; import SvgIcon from "@/components/SvgIcon/index.vue"; +import {doDelSpace} from "@/api/doc/space" +import Space from "./space.vue"; //TODO: add file icons done! //TODO: click on table-item, 1)preview on file ..................... @@ -44,12 +40,13 @@ import SvgIcon from "@/components/SvgIcon/index.vue"; const userStore = useUserStore(); const uid=btoa("p0"+userStore.userInfoCont.userId); +const rawUid="p0"+userStore.userInfoCont.userId const siteHost=document.location.origin; const apiURL=import.meta.env.VITE_APP_BASE_API+"/hxpan/api" const matterList = ref([]) const searchname=ref("") -const newdir=ref("") //创建新目录时的目录名 +const newdirName=ref("") //创建新目录时的目录名 const currentHoverRow=ref("") //table 行的按钮控制 const selectedValue = ref("sixhour") //分享弹窗的世间变量 const tabSelected=ref([]) //table组件多选数据维护 @@ -65,8 +62,7 @@ const multipleTableRef = ref() const paginInfo = ref({ page: 0, total: 0 }) const PRIVATESPACE = ref(true) //是空间状态的控制 2种:私有云盘和共享空间 -const SpaceID= ref<{name:string,uuid:string,userUuid:string}>({}) //当前space的id -const SpaceList=ref<{name:string,uuid:string,userUuid:string}[]>([]) +const SpaceID= ref<{name:string,uuid:string,userUuid:string,manager:boolean,permits:matterPermit}>({}) //当前space的id const spaceEleRef = ref() //space组件的引用,它与spaceTreeRef没有父子关系,反而是为了处理spaceTree的操作而创建的该变量 const spaceTreeData=ref([])//{name:'个人空间',uuid:'root',children:[]} const spaceTreeRef = ref(); //space的树树组件的引用 @@ -75,7 +71,7 @@ let spaceNodeUid="" //用来判断树组件的展开和关闭,如何只是展 const modListOrGrild=ref(true) const Departs = computed(() => { - return `${userStore.userInfoCont.company},${userStore.userInfoCont.department},${userStore.userInfoCont.organization}` + return `${'p0'+userStore.userInfoCont.userId},${userStore.userInfoCont.company},${userStore.userInfoCont.department},${userStore.userInfoCont.organization}` }) const uploadFormData = computed(() => { @@ -210,15 +206,17 @@ function onDelMatter(row:matterInfo){ } function onDelMatBatch(){ - ElMessageBox.confirm("确认删除选择的内容?", "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning", + ElMessageBox.confirm("确认删除选择的内容?", "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }).then(()=>{ + postDelMatBatch(uid,{ + "uuids":tabSelected.value.map((item:matterInfo)=>item.uuid).join(",") }).then(()=>{ - postDelMatBatch(uid,{ - "uuids":tabSelected.value.map((item:matterInfo)=>item.uuid).join(",") - }).then(()=>onLoadMatterList()) + router.replace({ query: { t: Date.now() } }) }) + }) } function onDownload(row:matterInfo){ @@ -323,21 +321,30 @@ function onCreateDir(){ postCreateDir(uid,{ userUuid:uid, puuid:currentNode.value.uuid, - name:newdir.value, + name:newdirName.value, }).then((resp)=> { - newdir.value="" + newdirName.value="" //调用tree的append方法 treeRef.value.append( {uuid:resp.data.uuid,dir:false,name:resp.data.name,puuid:resp.data.puuid}, currentNode.value.uuid ) - //onLoadMatterList() + matterList.value?.shift() //删除头部的空位 + matterList.value?.push(resp.data) //把新建的添加到最后 }) .catch((e)=>{ ElMessage.error(e.msg) }) } +function onDBclickMatter(row:matterInfo){ + if(row.dir){ + onNodeClick(row as matterTree,null,null,null) + }else{ + onPrivateView(row) + } +} + //树节点展开 function onNodeExpand(node: TreeNode, resolve: (data: matterTree[]) => void, reject: () => void) { if ((node.data as matterTree).uuid) { @@ -607,7 +614,8 @@ function onNewSpace(){ }).then(() => { if(newname.value!==""){ doCreateSpace(uid,newname.value).then((resp)=>{ - SpaceList.value.push({name:resp.data.name,uuid:resp.data.uuid,userUuid:"p0"+userStore.userInfoCont.userId}) + //spaceTreeRef.value.append({name:resp.data.name,uuid:resp.data.uuid,dir:false,userUuid:resp.data.userUuid}) + router.replace({ query: { t: Date.now() } }) //直接刷新 }) } }) @@ -625,7 +633,9 @@ function onSpaceNodeClick(data:matterTree,node:TreeNode,self:any,env:any){ SpaceID.value={ name: data.name ?? "", uuid: data.uuid ?? "", - userUuid: data.userUuid ?? "" + userUuid: data.userUuid ?? "", + manager: data.manager ?? false, + permits:data.permits ?? { id: 0, MatterUuid: '', data: '' } }; PRIVATESPACE.value=false; }else{ @@ -634,7 +644,9 @@ function onSpaceNodeClick(data:matterTree,node:TreeNode,self:any,env:any){ puuid: data.puuid, name:data.name, agent:data.agent, - dir:true + dir:true, + permits:data.permits, + path:data.path } //打开具体的节点 spaceEleRef.value.handleDoubleClick(matter) @@ -646,6 +658,41 @@ function flushSpaceTree(uuid:string,data:matterTree[]){ spaceTreeRef.value.updateKeyChildren(uuid,data) } +//删除空间 +function onDeleteSpace(row:matterInfo){ + ElMessageBox.confirm(`确认删除空间 ( ${row.name}) ? 空间内所有文件将不可恢复!取消则放弃删除操作。`, "警告", { + confirmButtonText: "确定删除", + cancelButtonText: "取消", + type: "warning", + }).then(()=>{ + doDelSpace(uid,{ + "space":row.uuid, + }).then(()=>{ + router.replace({ query: { t: Date.now() } }) + }) + }) +} + +//删除空间matter +function onDelSpaceMatter(row:matterInfo){ + if(row.puuid){ + spaceEleRef.value.onDelMatter(row) + }else{ + onDeleteSpace(row) + } +} +//空间权限控制管理 +function onSpacePManage(row:matterInfo){ + dynamicVNode.value=h(spacePermission,{ + uid:rawUid, //当前用户的uuid + uuid:row.uuid, //文档的uuid + suid:SpaceID.value.userUuid, + spaceid:SpaceID.value.uuid, //空间uuid + closeFunc:()=>dynamicVNode.value=null + }) +} + + //------------------------------------------------------ //http://172.20.2.87:6010/api/alien/preview/5a10aaf6-396e-4d9a-7e87-3c5c8029d4db/123.png?ir=fill_100_100 //渲染完页面再执行 @@ -654,12 +701,12 @@ onMounted(() => { {name:'个人空间',uuid:'root',dir:false}, currentNode.value.uuid ) - //加载我的空间列表 - getMySpaces(uid,{roles:Departs}).then((resp)=>{ - //SpaceList.value=resp.data + getMySpaces(uid,{roles:Departs.value}).then((resp)=>{ resp.data.forEach((item)=>{ - spaceTreeRef.value.append({name:item.name,uuid:item.uuid,dir:false,userUuid:item.userUuid}) + let ismanager=false + if(item.userUuid==rawUid || item.managers.includes(rawUid)) ismanager=true; + spaceTreeRef.value.append({name:item.name,uuid:item.uuid,dir:false,userUuid:item.userUuid,manager:ismanager,permits:item.permits}) }) }) let val =localStorage.getItem("listOrGrid") @@ -690,28 +737,47 @@ const handleSelectionChange = (val:matterInfo[]) => { :load="onNodeExpand" :default-expanded-keys="['root']" @node-click="onNodeClick" - /> - 共享空间 + > + + +
共享空间
-
    -
  • {{ sp.name }}
  • -
+ > + +
- 根目录/ + 根目录/ {{ currentNode.name }} @@ -742,9 +808,6 @@ const handleSelectionChange = (val:matterInfo[]) => { 分享 删除 - 分享目录 - 删除目录 @@ -766,8 +829,8 @@ const handleSelectionChange = (val:matterInfo[]) => {