Browse Source

yunpan: 修复第一次打开没有数据的问题

lwx_v12
han2015 1 month ago
parent
commit
b7ca30eafc
  1. 8
      src/api/doc/type.ts
  2. 5
      src/utils/router/index.ts
  3. 18
      src/views/doc/agent.vue
  4. 222
      src/views/doc/favourite.vue
  5. 8
      src/views/doc/index.vue

8
src/api/doc/type.ts

@ -52,6 +52,14 @@ export interface shareItem{
expireTime?:string;
permitList?:string;
}
//收藏夹数据结构
export interface favourItem{
name:string;
uuid:string; //文件uuid
userUuid:string; //owner uuid
path:string;
permitVal:number; //该值是当前用户permits的解析结果
}
export interface matterTree extends matterInfo {
manager?:boolean;

5
src/utils/router/index.ts

@ -101,6 +101,11 @@ export const staticRouting : RouteRecordRaw[] = [
component: () => import('@/views/doc/agent.vue'),
meta: { hidden: true },
},
// {
// path: '/favourites',
// component: () => import('@/views/doc/favourite.vue'),
// meta: { hidden: true },
// },
{
path: '/spaces/:spaceid',
name: 'spaces',

18
src/views/doc/agent.vue

@ -6,7 +6,7 @@
<script lang="ts" setup>
import {
Promotion,
Remove,
Remove,DocumentCopy,
ArrowLeft,
} from '@element-plus/icons-vue'
import { userStror } from "@/utils/pinia/stores/modules/userOrders";
@ -169,7 +169,7 @@ function showChat(uuid:string){
interact_msg.value = JSON.parse(resp.data.content)
conversation.value=resp.data.uuid
if(resp.data.agentuuid!=""){
agent.value={name:"会话",uuid:resp.data.agentuuid}
agent.value={name:"基于当前会话",uuid:resp.data.agentuuid}
}
})
}
@ -228,6 +228,15 @@ function formatRefContent(content:string){
result=result.replace(/Unnamed: /g,' ')
return result
}
//
function onCopyChat(idx:number){
let el = document.querySelector('#content'+idx) as HTMLElement | null;
let content = el?.innerText;
if(!navigator.clipboard) alert("clipboard 不可用")
navigator.clipboard.writeText(content as string)
}
//
function onShareChat(agID:string,chatID:string,idx:number){
const arr=<{ask:boolean,content:string}[]>([])
@ -318,14 +327,17 @@ onMounted(() => {
</div>
<div class="app_container">
<div class="reply_area" >
<span style="text-align: center;margin-bottom: 12px;">{{ agent.name }}: 智能体</span>
<template v-for="msg,index of interact_msg">
<el-text v-if="msg.ask" class="t_ask" >{{ msg.content }}</el-text>
<div v-else class="t_resp">
<el-text style="white-space: pre-line" v-html="msg.think"></el-text>
<VueMarkdown :markdown="msg.content" :rehype-plugins="[rehypeRaw]" :remark-plugins="[remarkGfm]" ></VueMarkdown>
<VueMarkdown :id="'content'+index" :markdown="msg.content" :rehype-plugins="[rehypeRaw]" :remark-plugins="[remarkGfm]" ></VueMarkdown>
<div v-if="conversation" class="actions">
<el-button :icon="Promotion" size="small" circle @click="onShareChat(agent.uuid,conversation,index)"></el-button> 分享
<el-button :icon="DocumentCopy" size="small" circle @click="onCopyChat(index)"></el-button> 复制
</div>
<div v-if="msg.docinfo?.length>0" class="doc_ref">

222
src/views/doc/favourite.vue

@ -0,0 +1,222 @@
<!--
@ 作者: han2015
@ 时间: 2025-05-12 15:39:13
@ 备注: 文档管理组件
-->
<script lang="ts" setup>
import { getShareList,getShareBrowse,postShareDelete} from "@/api/doc/index"
import { matterPage,favourItem,respCreateShare } from "@/api/doc/type"
import { h } from 'vue'
import router from "@/utils/router";
import { useRoute } from 'vue-router'
import { userStror } from "@/utils/pinia/stores/modules/userOrders";
import {
ArrowLeft,
} from '@element-plus/icons-vue'
import {ElText,ElButton } from "element-plus";
import {getFileIcon,checkExpirTime,fileType,readableSize} from "./tools"
import preview from './preview.vue';
const userStore = userStror();
const uid=btoa("p0"+userStore.userInfoCont.userId);
const siteHost=document.location.origin;
const apiURL=import.meta.env.VITE_APP_BASE_API+"/hxpan/api"
const udprt=btoa("d"+userStore.userInfoCont.department);
const route = useRoute()
const officeHost=import.meta.env.VITE_OFFICE_HOST
const matterList = ref<favourItem[]>() //
//------------------------
const showPopup=ref(false)
const currentHoverRow=ref<favourItem>({}) //table
const modListOrGrild=ref(true) //
//----------------------------------
const dynamicVNode = ref<VNode | null>(null) //permission
//
function onLoadShareList(){
let _page: matterPage = {
page: 0,
pageSize: 100,
orderCreateTime: "DESC",
orderDir: "DESC",
}
getShareList(uid,_page).then((resp)=>{
matterList.value=resp.data.data
})
}
onMounted(() => {
onLoadShareList()
})
</script>
<template>
<div class="navBtn">
<el-button type="text" :icon="ArrowLeft" @click="router.back()">返回</el-button>
</div>
<div class="app_container">
<el-row :gutter="24">
<el-table v-if="modListOrGrild"
stripe
:data="matterList"
ref="multipleTableRef"
:header-cell-style="{ background: '#f5f8fd' }"
row-key="uuid"
:row-style ="() => ({ lineHeight: '36px'})">
<el-table-column property="name">
<template #default="scope">
<div style="display: flex; align-items: center;" @click="handleDoubleClick(scope.row)" >
<el-image v-if="getFileIcon(scope.row.name)==='img'" style="width: 30px;"
:preview-src-list="[getImageDownloadURL(scope.row.uuid,scope.row.name)]"
:src="getImagePreivewURL(scope.row.uuid,scope.row.name)" />
<svg-icon v-else :icon-class="getFileIcon(scope.row.name)+'-icon'" size="30px" />
<span style="margin-left: 10px">{{ scope.row.name }}</span>
<el-button class="setBtn" type="text" icon="MoreFilled" size="small"
@click="(e)=>{e.stopPropagation(); showPopup=true; currentHoverRow=scope.row;}"></el-button>
</div>
</template>
</el-table-column>
</el-table>
</el-row>
</div>
<div v-if="showPopup" class="mask" @click="showPopup = false"></div>
<!-- 主体 -->
<Transition name="popuper">
<div v-if="showPopup" class="bs-wrapper">
<div class="popupTitle">
<svg-icon :icon-class="getFileIcon(currentHoverRow.name)+'-icon'" size="30px"/>
{{ currentHoverRow.name }}
<el-button type="text" @click="showPopup=false">关闭</el-button>
</div>
<hr>
<div class="blocker-list">
<span class="blocker" @click="onShareView(currentHoverRow)">
<View class="plus-icon"></View>预览</span>
<span class="blocker" @click="showShareMessage(currentHoverRow)">
<View class="plus-icon"></View>详情</span>
<span class="blocker" @click="onDownload(currentHoverRow)">
<Download class="plus-icon"></Download>下载</span>
<span class="blocker" @click="onShareDelete(currentHoverRow)">
<Delete class="plus-icon"></Delete>删除</span>
</div>
</div>
</Transition>
<div v-if="dynamicVNode" style="height: inherit;">
<component :is="dynamicVNode" />
</div>
</template>
<style lang="scss" scoped>
.app_container {
padding: 10px;
height: calc(100% - 10px);
overflow-y: auto;
width: 100%;
position: relative;
}
.navBtn{
position: fixed;
background-color: #ffffff94;
width: 100%;
z-index: 55;
}
.setBtn{
margin-right: 10px;
margin-left: auto;
}
//---------------animation
/* 遮罩: popup 的遮罩 */
.mask{
position: fixed;
inset: 0;
background:rgba(0,0,0,.4);
z-index:999;
}
.bs-wrapper{
position: fixed;
display: flex;
flex-direction: column;
left:0;
right:0;
bottom:0;
height:36vh; /* 半屏停住 */
background:#f1f1f1;
border-radius:16px 16px 0 0;
z-index:1000;
overflow-y:auto;
padding: 8px 16px;
hr{
margin: 8px 0;
border: none;
width: 88%;
align-self: center;
background: #63616145;
}
}
.popupTitle{
display: flex;
align-items: center;
button{
margin-left: auto;
margin-right: 5px;
}
}
.blocker-list{
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
font-size: small;
.blocker{
display: flex;
flex-direction: column;
align-items: center;
padding-top: 15px;
background-color: white;
border-radius: 5px;
margin: 6px;
width: 70px;
height: 70px;
}
}
.popuper-enter-from{
transform:translateY(100%);
opacity:0;
}
/* 进入过程 */
.popuper-enter-active{
transition:all .3s ease-out;
}
/* 离开后:回到下方 */
.popuper-leave-to{
transform:translateY(50px);
opacity:0;
}
.popuper-leave-active{
transition:all .3s ease-in;
}
.plus-icon{
width: 20px;
height: 20px;
}
//---------------------------
</style>

8
src/views/doc/index.vue

@ -37,8 +37,12 @@ function onSelectSpace(data:matterInfo,recycling?:number){
state:{
space: toRaw(data), //toRaw
}
});
});
}else{
if(recycling==1) {
router.push({ path: "/favourites",query:{fa:7}});
return
}
if(recycling==3) {
router.push({ path: "/mysapce",query:{fa:7,recycling:recycling}});
return
@ -174,7 +178,7 @@ function onSpaceConfig(row:matterInfo){
onMounted(()=>{
if(userStore.userInfoCont == ""){
userStore.getInfo().then(()=>{
getMySpaces(uid,{roles:Departs.value}).then((resp)=>{
getMySpaces(btoa("p0"+userStore.userInfoCont.userId),{roles:Departs.value}).then((resp)=>{
resp.data.forEach((item)=>{
let ismanager=false
if(item.userUuid==rawUid || item.managers.includes(rawUid)) ismanager=true;

Loading…
Cancel
Save