Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
E
exhibition_backstage
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
龙菲
exhibition_backstage
Commits
b24f538e
提交
b24f538e
authored
10月 12, 2023
作者:
龙菲
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
对接审核列表;对接展览模块新接口
上级
cadb721d
全部展开
显示空白字符变更
内嵌
并排
正在显示
29 个修改的文件
包含
758 行增加
和
384 行删除
+758
-384
display.js
src/api/display.js
+3
-3
bizCommon.js
src/utils/bizCommon.js
+8
-0
fileUploadFuctions.js
src/utils/fileUploadFuctions.js
+14
-0
transformData.js
src/utils/transformData.js
+2
-0
InfoEditDialog.vue
src/views/culturalRelic/components/InfoEditDialog.vue
+31
-50
fileUploadFuctions.js
src/views/culturalRelic/configs/fileUploadFuctions.js
+0
-0
list.js
src/views/culturalRelic/configs/list.js
+8
-14
transformData.js
src/views/culturalRelic/configs/transformData.js
+0
-0
validateRules.js
src/views/culturalRelic/configs/validateRules.js
+0
-0
index.vue
src/views/culturalRelic/index.vue
+1
-0
InfoEditDialog copy.vue
src/views/display/components/InfoEditDialog copy.vue
+0
-0
InfoEditDialog.vue
src/views/display/components/InfoEditDialog.vue
+0
-0
units.js
src/views/display/components/units.js
+135
-0
list.js
src/views/display/configs/list.js
+107
-8
urls.js
src/views/display/configs/urls.js
+3
-0
validateRules.js
src/views/display/configs/validateRules.js
+8
-0
index.vue
src/views/display/index.vue
+91
-48
index.vue
src/views/displayApproval copy/index.vue
+92
-57
config.js
src/views/displayApproval/config.js
+13
-13
index.vue
src/views/displayApproval/index.vue
+22
-45
index.vue
src/views/importExport/index.vue
+1
-10
index.vue
src/views/literature/index.vue
+6
-12
index.vue
src/views/log/index.vue
+12
-16
index.vue
src/views/museum/index.vue
+0
-8
index.vue
src/views/product/index.vue
+61
-25
index.vue
src/views/role/index.vue
+6
-12
index.vue
src/views/user/index.vue
+72
-36
index.vue
src/views/virtual/index.vue
+61
-26
vue.config.js
vue.config.js
+1
-1
没有找到文件。
src/api/display.js
浏览文件 @
b24f538e
...
...
@@ -69,11 +69,11 @@ export function getDisplayById(params) {
}
// 修改展览(临时表)
export
function
getDisplayByIdTemp
(
params
)
{
export
function
getDisplayByIdTemp
(
data
)
{
return
request
({
url
:
'/bizExhibitionTemp/detailById'
,
method
:
'
ge
t'
,
params
method
:
'
pos
t'
,
data
})
}
...
...
src/utils/bizCommon.js
0 → 100644
浏览文件 @
b24f538e
// 本文件用于提取一些通用的业务层面的公共方法
import
store
from
'@/store'
const
bizCommon
=
{
}
\ No newline at end of file
src/utils/fileUploadFuctions.js
浏览文件 @
b24f538e
...
...
@@ -143,5 +143,19 @@ const fileUploadFuctions = {
});
return
arr
;
},
/**
* @param {array} fileArr 需要被删除的文件ID数组
*/
async
handleDeleteFiles
(
fileArr
)
{
console
.
log
(
"doing delete"
);
if
(
fileArr
.
length
==
0
)
{
console
.
log
(
"nothing to delete"
);
return
;
}
await
deleteFiles
(
fileArr
);
console
.
log
(
"delete done"
);
},
};
export
default
fileUploadFuctions
;
src/utils/transformData.js
浏览文件 @
b24f538e
// 本文件提供一些前端和后端数据交互和转换的一些方法,可批量使用的
const
transformData
=
{
/**
* 转换服务器的封面数据到前端可用的封面数据
...
...
src/views/culturalRelic/components/InfoEditDialog.vue
浏览文件 @
b24f538e
...
...
@@ -280,12 +280,12 @@
<
script
>
import
{
getLiteratureList
}
from
"@/api/literature"
;
import
{
addOrUpdateCulturalRelic
}
from
"@/api/culturalRelic"
;
import
{
mapGetters
}
from
"vuex"
;
import
{
mapGetters
,
mapActions
}
from
"vuex"
;
import
{
uploadV1
}
from
"@/utils/file"
;
import
{
deleteFiles
}
from
"@/api/file"
;
import
{
rules
}
from
".
/j
s/validateRules"
;
import
fileUploadFunctions
from
"
./j
s/fileUploadFuctions"
;
import
transformData
from
"
./j
s/transformData"
;
import
{
rules
}
from
".
./config
s/validateRules"
;
import
fileUploadFunctions
from
"
@/util
s/fileUploadFuctions"
;
import
transformData
from
"
@/util
s/transformData"
;
const
{
faceImageToClient
,
literatureIdArrToStr
,
...
...
@@ -294,7 +294,7 @@ const {
statusStrToBool
,
getDeptIdArr
,
getDeptIdStr
,
file3dToClient
file3dToClient
,
}
=
transformData
;
export
default
{
name
:
"InfoEditDialog"
,
...
...
@@ -374,11 +374,23 @@ export default {
};
},
async
created
()
{
await
this
.
getDictList
();
await
this
.
getDictTree
();
await
this
.
getMuseumData
();
await
this
.
getDictList
([
"culturalRelicLevel"
,
"culturalRelicType"
,
"culturalRelicSourceWay"
,
]);
const
res
=
await
this
.
getDictTree
([
"culturalRelicTextureType"
,
"culturalRelicYears"
,
]);
this
.
culturalRelicTextureType
=
res
.
culturalRelicTextureType
;
this
.
culturalRelicYears
=
res
.
culturalRelicYears
;
this
.
orgTreeData
=
await
this
.
getMuseumTreeData
(
false
);
this
.
searchLiterature
();
},
methods
:
{
...
mapActions
(
"dict"
,
[
"getDictList"
,
"getDictTree"
]),
...
mapActions
(
"org"
,
[
"getMuseumTreeData"
]),
//回显服务器传来的数据
covertServerData
(
serverData
)
{
this
.
dialogForm
=
JSON
.
parse
(
JSON
.
stringify
(
serverData
));
...
...
@@ -391,43 +403,21 @@ export default {
status
,
literatureVo
,
deptId
,
file3d
,
file3dUrl
,
}
=
this
.
dialogForm
;
this
.
dialogForm
.
status
=
statusStrToBool
(
status
);
this
.
faceImage
=
faceImageToClient
(
faceImagePressUrl
,
faceImageUrl
);
this
.
file3d
=
file3dToClient
(
f
aceImagePressUrl
,
faceImage
Url
);
this
.
file3d
=
file3dToClient
(
f
ile3d
,
file3d
Url
);
this
.
images
=
imagesVo
||
[];
this
.
videos
=
videosVo
||
[];
this
.
audios
=
audiosVo
||
[];
this
.
literatureIdArr
=
literatureListToIds
(
literatureVo
);
this
.
dialogForm
.
deptId
=
getDeptIdArr
(
deptId
,
this
.
userInfo
);
},
// 获取字典列表
async
getDictList
()
{
await
this
.
$store
.
dispatch
(
"dict/getDictList"
,
[
"culturalRelicLevel"
,
"culturalRelicType"
,
"culturalRelicSourceWay"
,
]);
},
// 获取字典树
async
getDictTree
()
{
let
res
=
await
this
.
$store
.
dispatch
(
"dict/getDictTree"
,
[
"culturalRelicTextureType"
,
"culturalRelicYears"
,
]);
this
.
culturalRelicTextureType
=
res
.
culturalRelicTextureType
;
this
.
culturalRelicYears
=
res
.
culturalRelicYears
;
},
// 获取博物馆数据
async
getMuseumData
()
{
let
res
=
await
this
.
$store
.
dispatch
(
"org/getMuseumTreeData"
,
false
);
this
.
orgTreeData
=
res
;
},
// 关联文献查询
searchLiterature
(
queryString
)
{
if
(
!
queryString
.
trim
())
{
if
(
!
queryString
||
!
queryString
.
trim
())
{
this
.
literatureList
=
[];
return
;
}
...
...
@@ -477,14 +467,13 @@ export default {
this
.
submitLoading
=
true
;
this
.
uploadMediaFiles
(
this
.
mediaKeys
,
this
.
dialogForm
)
.
then
(
async
(
mediaForm
)
=>
{
console
.
log
(
mediaForm
);
//
console.log(mediaForm);
this
.
loadingText
=
"正在提交表单..."
;
const
form
=
this
.
getSubmitForm
(
this
.
dialogForm
,
mediaForm
);
const
{
status
,
years
,
textureType
,
deptId
}
=
form
;
const
{
literatureIdArr
}
=
this
;
form
.
status
=
statusBoolToNum
(
status
);
form
.
literature
=
literatureIdArrToStr
(
literatureIdArr
);
// 处理年份
form
.
years
=
this
.
processYear
(
years
);
form
.
textureType
=
this
.
processTextureType
(
textureType
);
form
.
deptId
=
getDeptIdStr
(
deptId
);
...
...
@@ -492,6 +481,8 @@ export default {
this
.
submitLoading
=
false
;
if
(
res
.
code
==
0
)
{
this
.
$message
.
success
(
"提交成功!"
);
this
.
$emit
(
"refresh"
);
this
.
$emit
(
"handleClose"
);
}
})
.
catch
((
err
)
=>
{
...
...
@@ -523,18 +514,7 @@ export default {
return
""
;
}
},
/**
* @param {array} fileArr 需要被删除的文件ID数组
*/
async
handleDeleteFiles
(
fileArr
)
{
console
.
log
(
"doing delete"
);
if
(
fileArr
.
length
==
0
)
{
console
.
log
(
"nothing to delete"
);
return
;
}
await
deleteFiles
(
fileArr
);
console
.
log
(
"delete done"
);
},
/**
* 上传对应的媒体文件,并返回一个promise
* @param {array} dialogForm 当前需要提交的表单
...
...
@@ -551,6 +531,7 @@ export default {
getMergedIdsObj
,
getDeleteFileArr
,
isFormDataHasData
,
handleDeleteFiles
,
}
=
fileUploadFunctions
;
const
formData
=
getNeedUploadFormData
(
this
,
mediaKeys
);
try
{
...
...
@@ -571,7 +552,7 @@ export default {
newIdObj
,
mediaKeys
);
this
.
handleDeleteFiles
(
deleteIdArr
);
handleDeleteFiles
(
deleteIdArr
);
console
.
log
(
"mergedFileIdsObj"
,
mergedIdObj
);
console
.
log
(
"deleteFiles"
,
deleteIdArr
);
console
.
log
(
"uploadMediaFiles done"
);
...
...
@@ -579,7 +560,7 @@ export default {
}
}
else
{
console
.
log
(
"uploadMediaFiles nothing to upload"
);
resolve
(
false
);
resolve
(
{}
);
}
}
catch
(
error
)
{
console
.
error
(
"uploadMediaFiles error"
);
...
...
src/views/culturalRelic/co
mponents/j
s/fileUploadFuctions.js
→
src/views/culturalRelic/co
nfig
s/fileUploadFuctions.js
浏览文件 @
b24f538e
File moved
src/views/culturalRelic/configs/list.js
浏览文件 @
b24f538e
...
...
@@ -201,13 +201,13 @@ export const unPassedTitle = [{
columnAlign
:
'center'
,
isFaceImage
:
true
,
},
{
prop
:
"status"
,
label
:
"上下架状态"
,
width
:
100
,
columnAlign
:
'center'
,
isStatus
:
true
},
//
{
//
prop: "status",
//
label: "上下架状态",
//
width: 100,
//
columnAlign: 'center',
//
isStatus: true
//
},
// {
// prop: "num",
// label: "数量",
...
...
@@ -284,7 +284,7 @@ export const searchConfig = [
{
prop
:
"name"
,
type
:
"input"
,
label
:
"
文物
名称"
,
label
:
"
展览
名称"
,
},
{
prop
:
"status"
,
...
...
@@ -301,11 +301,5 @@ export const searchConfig = [
},
],
},
// 是否只看3D
{
prop
:
"upload3dFlag"
,
type
:
"checkbox"
,
label
:
"只看3D"
,
},
]
src/views/culturalRelic/co
mponents/j
s/transformData.js
→
src/views/culturalRelic/co
nfig
s/transformData.js
浏览文件 @
b24f538e
File moved
src/views/culturalRelic/co
mponents/j
s/validateRules.js
→
src/views/culturalRelic/co
nfig
s/validateRules.js
浏览文件 @
b24f538e
File moved
src/views/culturalRelic/index.vue
浏览文件 @
b24f538e
...
...
@@ -310,6 +310,7 @@ export default {
this
.
$refs
.
View3dDialog
.
visible
=
true
;
break
;
case
"edit"
:
console
.
log
(
value
,
row
);
let
detailRes
=
await
getRCDetailByIdTemp
({
crId
:
row
.
crId
});
if
(
detailRes
.
code
==
0
)
{
this
.
form
=
detailRes
.
data
;
...
...
src/views/display/components/InfoEditDialog copy.vue
0 → 100644
浏览文件 @
b24f538e
差异被折叠。
点击展开。
src/views/display/components/InfoEditDialog.vue
浏览文件 @
b24f538e
差异被折叠。
点击展开。
src/views/display/components/units.js
0 → 100644
浏览文件 @
b24f538e
import
fileUploadFuctions
from
"@/utils/fileUploadFuctions"
;
const
unitsFunctions
=
{
/**
* 获取新的布展单元,实装媒体id,
* @param {*} exhibitionUnits
* @param {*} upLoadRes
* @returns
*/
getNewUnits
(
exhibitionUnits
,
upLoadRes
)
{
const
unitCopy
=
JSON
.
parse
(
JSON
.
stringify
(
exhibitionUnits
))
//不要修改原本的数据
const
callback
=
(
arr
)
=>
{
arr
.
forEach
(
unitItem
=>
{
// 每一个unitItem有自己的euid,有唯一的一个images,唯一的一个videos
// 目的是要让每一个unitItem的images,videos实装回去,crId拼接回去
// mediaObj形如{
// images: "1,2,3",
// videos: "4,5,6",
// }
const
mediaForm
=
unitsFunctions
.
getMediaForm
(
unitItem
,
upLoadRes
)
const
crForm
=
unitsFunctions
.
getCrForm
(
unitItem
)
unitItem
=
Object
.
assign
(
unitItem
,
mediaForm
,
crForm
)
});
}
// 遍历布展单元,并执行callback
unitsFunctions
.
loopUnits
(
unitCopy
,
callback
)
return
unitCopy
},
getMediaForm
(
unitItem
,
upLoadRes
)
{
const
{
euId
}
=
unitItem
const
mediaForm
=
unitsFunctions
.
getUnitFileIdstrObj
(
euId
,
upLoadRes
)
return
mediaForm
},
getCrForm
(
unitItem
)
{
const
obj
=
{
crIds
:
''
}
const
{
crIds
}
=
unitItem
if
(
crIds
instanceof
Array
)
{
obj
.
crIds
=
crIds
.
join
(
","
);
}
else
if
(
crIds
)
{
obj
.
crIds
=
crIds
}
return
obj
},
/**
*
* @param {Array} arr 布展单元的数组
* @param {Function} callback 循环处理什么事
*/
loopUnits
(
arr
,
callback
)
{
if
(
arr
.
length
>
0
)
{
callback
(
arr
)
if
(
arr
.
children
)
{
unitsFunctions
.
loopUnits
(
arr
.
children
,
callback
)
}
}
},
/**
* 获取布展单元下面的媒体的id字符串
* @param {String} euId 布展单元的key euId
* @param {String} res 上传后的结果 如unit-images-${euid}
* @returns {Obj} euId对应媒体文件ID字符串
* 形如{
images: "1,2,3",
videos: "4,5,6",
}item.fileId
*/
getUnitFileIdstrObj
(
euId
,
res
)
{
const
obj
=
{};
const
unitMediaKeys
=
[
"images"
];
const
unitMediaFileIdArr
=
unitMediaKeys
.
map
((
mediaKey
)
=>
{
const
filterArr
=
res
.
data
.
filter
((
item
)
=>
{
// 如果是当前的euId下的文件
const
str1
=
`unit-
${
mediaKey
}
-
${
euId
}
`
const
arr
=
item
.
fileKey
.
split
(
'-'
)
const
str2
=
arr
.
slice
(
0
,
3
).
join
(
'-'
)
//前三位拼接
return
str1
===
str2
});
const
arr
=
filterArr
.
map
(
item
=>
{
return
item
.
fileId
})
return
arr
;
});
unitMediaKeys
.
forEach
((
key
,
index
)
=>
{
if
(
unitMediaFileIdArr
[
index
].
length
>
0
)
{
obj
[
key
]
=
unitMediaFileIdArr
[
index
].
join
(
","
);
}
else
{
obj
[
key
]
=
""
;
}
});
return
obj
;
},
/**
* 添加布展单元的图片至formData
* @param {array} unitData 布展单元数据
* @param {FormData} formData 需要上传的表单
*/
addUnitImageToFormData
(
unitData
,
formData
)
{
const
callback
=
(
arr
)
=>
{
arr
.
forEach
(
unitItem
=>
{
unitsFunctions
.
appendMediaItemToFormData
(
unitItem
,
formData
,
"images"
);
})
}
unitsFunctions
.
loopUnits
(
unitData
,
callback
)
},
/**
* 添加布展单元媒体item至formData
* @param {array} unitItem 布展单元的item
* @param {FormData} media 表单中存储ids的key
* @param {FormData} mediaVo 表单中存储文件List的key
*/
appendMediaItemToFormData
(
unitItem
,
formData
,
mediaKey
)
{
const
mediaVo
=
unitItem
[
`
${
mediaKey
}
Vo`
];
if
(
mediaVo
&&
mediaVo
.
length
>
0
)
{
mediaVo
.
forEach
((
file
,
index
)
=>
{
if
(
fileUploadFuctions
.
isFileRaw
(
file
))
{
const
uploadKey
=
`unit-
${
mediaKey
}
-
${
unitItem
.
euId
}
-
${
index
}
`
;
formData
.
append
(
uploadKey
,
file
.
raw
);
}
});
}
},
getUnitDeleteArr
(
newUnit
,
oldUnit
)
{
const
deleteArr
=
[]
return
deleteArr
}
}
export
default
unitsFunctions
\ No newline at end of file
src/views/display/configs/list.js
浏览文件 @
b24f538e
...
...
@@ -44,7 +44,7 @@ export const searchConfig = [
},
];
export
const
t
itle
=
[
export
const
passedT
itle
=
[
{
prop
:
"title"
,
label
:
"标题"
,
...
...
@@ -118,6 +118,97 @@ export const title = [
sortable
:
true
,
},
{
prop
:
"status"
,
label
:
"是否上架"
,
columnAlign
:
"center"
,
isStatus
:
true
,
},
{
prop
:
"themeType"
,
label
:
"模板主题"
,
columnAlign
:
"center"
,
},
{
prop
:
"remark"
,
label
:
"备注"
,
columnAlign
:
"center"
,
showOverFlowToolTip
:
true
,
},
// {
// prop: "images",
// label: "展览图片",
// columnAlign: 'center',
// isImages: true
// },
// {
// prop: "audios",
// label: "展览音频",
// columnAlign: 'center',
// isAudios: true
// },
// {
// prop: "videos",
// label: "展览视频",
// columnAlign: 'center',
// isVideos: true
// },
];
export
const
unPassedTitle
=
[
{
prop
:
"title"
,
label
:
"标题"
,
columnAlign
:
"center"
,
width
:
120
,
showOverFlowToolTip
:
true
,
},
{
prop
:
"keyword"
,
label
:
"关键词"
,
columnAlign
:
"center"
,
showOverFlowToolTip
:
true
,
},
{
prop
:
"type"
,
label
:
"展览类型"
,
columnAlign
:
"center"
,
isDisplayType
:
true
,
showOverFlowToolTip
:
true
,
},
{
prop
:
"deptName"
,
label
:
"展览单位"
,
columnAlign
:
"center"
,
showOverFlowToolTip
:
true
,
},
{
prop
:
"regionName"
,
label
:
"所在地区"
,
columnAlign
:
"center"
,
showOverFlowToolTip
:
true
,
},
{
prop
:
"faceImageUrl"
,
label
:
"封面"
,
columnAlign
:
"center"
,
isFaceImage
:
true
,
width
:
130
,
},
// {
// prop: "intro",
// label: "展览介绍",
// columnAlign: 'center',
// },
// {
// prop: "literature",
// label: "关联文献",
// columnAlign: 'center',
// width:100
// },
{
prop
:
"status"
,
label
:
"是否上架"
,
...
...
@@ -169,13 +260,13 @@ export const title = [
export
const
operates
=
{
operate
:
true
,
label
:
"操作"
,
width
:
"320px"
,
minwidth
:
"220px"
,
width
:
"140px"
,
titleAlign
:
"center"
,
columnAlign
:
"center"
,
};
export
const
operations
=
[
// 临时表
export
const
operationsTemp
=
[
{
type
:
"view"
,
title
:
"预览"
,
...
...
@@ -184,10 +275,18 @@ export const operations = [
type
:
"edit"
,
title
:
"编辑"
,
},
// {
// type: 'approval',
// title: '提交审核'
// },
{
type
:
"delete"
,
title
:
"删除"
,
},
];
// 最终表
export
const
operations
=
[
{
type
:
"edit"
,
title
:
"编辑"
,
},
{
type
:
"delete"
,
title
:
"删除"
,
...
...
src/views/display/configs/urls.js
0 → 100644
浏览文件 @
b24f538e
export
const
pageSelectUrl
=
"/api/bizCulturalRelic/listByPage"
export
const
upLoadAddress
=
process
.
env
.
VUE_APP_BASE_API
+
"/sysFiles/upload"
\ No newline at end of file
src/views/display/configs/validateRules.js
0 → 100644
浏览文件 @
b24f538e
export
const
rules
=
{
title
:
[{
required
:
true
,
message
:
"请输入展览标题"
,
trigger
:
"blur"
}],
deptId
:
[
{
required
:
true
,
message
:
"请填写展览单位"
,
trigger
:
"change"
},
],
intro
:
[{
required
:
true
,
message
:
"请填写展览介绍"
,
trigger
:
"blur"
}],
}
\ No newline at end of file
src/views/display/index.vue
浏览文件 @
b24f538e
...
...
@@ -55,10 +55,15 @@
</el-upload>
</div>
</div>
<div
class=
"list"
>
<el-tabs
v-model=
"tabActive"
>
<el-tab-pane
label=
"待办"
name=
"unPassed"
></el-tab-pane>
<el-tab-pane
label=
"已审核通过"
name=
"passed"
></el-tab-pane>
</el-tabs>
<TablePage
:data=
"list
.records"
:tableTitle=
"table
Title"
:operates=
"tableO
perates"
:data=
"getCurrentList()
.records"
:tableTitle=
"get
Title"
:operates=
"o
perates"
>
<template
v-slot:status=
"data"
>
<el-popconfirm
...
...
@@ -100,11 +105,15 @@
<
template
v-slot:faceImageUrl=
"data"
>
<img
:src=
"
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
$getFullUrl(
data.scope.faceImagePressUrl || data.scope.faceImageUrl
)
"
alt=
"暂无图片"
v-if=
"
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
$getFullUrl(
data.scope.faceImagePressUrl || data.scope.faceImageUrl
)
"
style=
"cursor: pointer"
width=
"100px"
...
...
@@ -116,10 +125,9 @@
</
template
>
<
template
v-slot:operates=
"scope"
>
<TableOperation
:operations=
"table
Operations"
:operations=
"get
Operations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
:disabled=
"isDisabled(scope.scope.row.checkStatus)"
>
</TableOperation>
</
template
>
...
...
@@ -136,6 +144,8 @@
class=
"pagination"
>
</el-pagination>
</div>
<InfoEditDialog
:visible=
"editDialogVisible"
:form=
"form"
...
...
@@ -173,11 +183,18 @@
</template>
<
script
>
import
{
title
,
operates
,
operations
}
from
"./configs/list"
;
import
{
passedTitle
,
unPassedTitle
,
operates
,
operations
,
operationsTemp
,
}
from
"./configs/list"
;
import
{
getListPer
,
getListPerTemp
,
deleteDisplay
,
getDisplayById
,
getDisplayById
Temp
,
editDisplay
,
}
from
"@/api/display"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
...
...
@@ -194,22 +211,25 @@ export default {
components
:
{
InfoEditDialog
,
PreviewDialog
,
SearchBar
,
ImportRecordDialog
,
UploadListDialog
,
},
data
()
{
let
that
=
this
;
return
{
// (存放两份数据的目的是为了防止切换的时候分页被重置)
//最终表
list
:
{
record
:
[],
record
s
:
[],
size
:
10
,
current
:
1
,
total
:
0
,
},
searchForm
:
{
name
:
""
,
status
:
""
,
// 临时表
listTemp
:
{
records
:
[],
size
:
10
,
current
:
1
,
total
:
0
,
},
searchConfig
,
editDialogVisible
:
false
,
...
...
@@ -250,16 +270,16 @@ export default {
uploadCount
:
0
,
//处于上传中的文件数量,当等于fileList的时候就关闭弹窗,请求完毕一个就++
cancelUploadArr
:
[],
//保存每个文件上传接口对应的取消请求的函数[fn,fn,fn...]
isUpLoading
:
false
,
tabActive
:
"unPassed"
,
passedTitle
,
unPassedTitle
,
operates
,
operations
,
operationsTemp
,
};
},
computed
:
{
...
mapGetters
([
"dicts"
]),
tableTitle
()
{
return
title
;
},
tableOperates
()
{
return
operates
;
},
tableOperations
()
{
return
operations
;
},
...
...
@@ -272,7 +292,6 @@ export default {
}
};
},
isDisabled
(
checkStatus
)
{
return
(
checkStatus
)
=>
{
return
checkStatus
==
"0"
;
...
...
@@ -286,6 +305,12 @@ export default {
return
checkStatus
==
"0"
||
checkStatus
==
"-1"
;
};
},
getOperations
()
{
return
this
.
tabActive
==
"passed"
?
this
.
operations
:
this
.
operationsTemp
;
},
getTitle
()
{
return
this
.
tabActive
==
"passed"
?
this
.
passedTitle
:
this
.
unPassedTitle
;
},
},
async
created
()
{
...
...
@@ -293,7 +318,6 @@ export default {
this
.
loadData
();
},
//watch部分
watch
:
{
//监听弹窗变化
multiUploadVisible
(
val
)
{
...
...
@@ -309,41 +333,58 @@ export default {
this
.
cancelUploadArr
=
[];
}
},
// 监听Tab值不同调取不同的接口
tabActive
(
value
)
{
this
.
resetPage
();
this
.
loadData
();
},
},
methods
:
{
async
search
(
form
)
{
var
params
=
{
page
:
1
,
limit
:
this
.
list
.
size
,
...
form
,
};
if
(
params
.
status
==
""
)
{
delete
params
.
status
;
}
let
res
=
await
getListPer
(
params
);
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
this
.
currentPageIds
=
this
.
list
.
records
.
map
((
item
)
=>
{
return
item
.
exhibitionId
;
});
// 清除分页到初始状态
resetPage
()
{
this
.
getCurrentList
().
current
=
1
;
},
// 设置两张表的数据
setList
(
data
)
{
if
(
this
.
tabActive
===
"passed"
)
{
this
.
list
=
data
;
}
else
{
this
.
listTemp
=
data
;
}
},
// 获取当前加载的list
getCurrentList
()
{
const
currentList
=
this
.
tabActive
==
"passed"
?
this
.
list
:
this
.
listTemp
;
return
currentList
;
},
// 获取当前请求方法
getCurrentRequest
()
{
const
currentRequest
=
this
.
tabActive
==
"passed"
?
getListPer
:
getListPerTemp
;
return
currentRequest
;
},
async
search
(
form
)
{
this
.
resetPage
();
this
.
loadData
(
form
);
},
reset
()
{
this
.
loadData
();
},
// 加载表格数据
async
loadData
()
{
async
loadData
(
form
)
{
const
{
current
,
size
}
=
this
.
getCurrentList
();
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
form
,
};
let
res
=
await
getListPer
(
params
);
const
currentRequest
=
this
.
getCurrentRequest
();
const
res
=
await
currentRequest
(
params
);
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
this
.
currentPageIds
=
this
.
list
.
records
.
map
((
item
)
=>
{
return
item
.
exhibitionId
;
});
this
.
setList
(
res
.
data
);
}
},
...
...
@@ -358,12 +399,14 @@ export default {
return
;
}
this
.
previewDialogVisible
=
true
;
let
res
=
await
getDisplayById
({
exhibitionId
:
row
.
exhibitionId
});
let
res
=
await
getDisplayByIdTemp
({
exhibitionId
:
row
.
exhibitionId
,
});
this
.
curPreviewObj
=
res
.
data
;
}
break
;
case
"edit"
:
let
editRes
=
await
getDisplayById
({
let
editRes
=
await
getDisplayById
Temp
({
exhibitionId
:
row
.
exhibitionId
,
});
this
.
form
=
editRes
.
data
;
...
...
@@ -496,7 +539,7 @@ export default {
async
reloadDisplay
(
exhibitionId
)
{
this
.
$refs
.
InfoEditDialog
.
submitLoading
=
true
;
this
.
$refs
.
InfoEditDialog
.
loadingText
=
"加载中..."
;
let
editRes
=
await
getDisplayById
({
let
editRes
=
await
getDisplayById
Temp
({
exhibitionId
,
});
this
.
form
=
editRes
.
data
;
...
...
@@ -570,7 +613,7 @@ export default {
},
async
handleCopySelect
(
value
)
{
const
{
exhibitionId
}
=
value
;
let
res
=
await
getDisplayById
({
exhibitionId
});
let
res
=
await
getDisplayById
Temp
({
exhibitionId
});
delete
res
.
data
.
exhibitionId
;
this
.
form
=
{
...
res
.
data
};
this
.
editDialogVisible
=
true
;
...
...
src/views/displayApproval copy/index.vue
浏览文件 @
b24f538e
...
...
@@ -12,8 +12,18 @@
</div>
-->
</div>
<el-tabs
v-model=
"activeName"
type=
"border-card"
ref=
"tabs"
>
<el-tab-pane
:label=
"item.label"
:name=
"item.name"
v-for=
"(item, tabIndex) in tabs"
:key=
"tabIndex"
>
<TablePage
:data=
"dataList[tabIndex].records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<el-tab-pane
:label=
"item.label"
:name=
"item.name"
v-for=
"(item, tabIndex) in tabs"
:key=
"tabIndex"
>
<TablePage
:data=
"dataList[tabIndex].records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<template
v-slot:checkStatus=
"data"
>
<!--
{{
data
.
scope
.
checkStatus
}}
-->
<el-tag
type=
"primary"
v-if=
"data.scope.checkStatus == 0"
>
...
...
@@ -30,55 +40,77 @@
{{
dicts
.
displayType
[
data
.
scope
.
type
]
}}
</
template
>
<
template
v-slot:faceImageUrl=
"data"
>
<img
:src=
"
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
"
alt=
"暂无图片"
v-if=
"$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)"
style=
"cursor: pointer"
width=
"100px"
@
click=
"handelPreviewImages(data.scope.faceImageUrl)"
/>
<img
:src=
"
$getFullUrl(
data.scope.faceImagePressUrl || data.scope.faceImageUrl
)
"
alt=
"暂无图片"
v-if=
"
$getFullUrl(
data.scope.faceImagePressUrl || data.scope.faceImageUrl
)
"
style=
"cursor: pointer"
width=
"100px"
@
click=
"handelPreviewImages(data.scope.faceImageUrl)"
/>
</
template
>
<
template
v-slot:operates=
"scope"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
</TableOperation>
</
template
>
</TablePage>
<el-pagination
style=
"margin: 16px 0"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(dataList[currentTabIndex].current)"
:page-sizes=
"[10, 20, 50, 100]"
:page-size=
"Number(dataList[currentTabIndex].size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(dataList[currentTabIndex].total)"
class=
"pagination"
>
<el-pagination
style=
"margin: 16px 0"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(dataList[currentTabIndex].current)"
:page-sizes=
"[10, 20, 50, 100]"
:page-size=
"Number(dataList[currentTabIndex].size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(dataList[currentTabIndex].total)"
class=
"pagination"
>
</el-pagination>
</el-tab-pane>
</el-tabs>
<PreviewDisplayDialog
v-if=
"Object.keys(curPreviewObj).length > 0"
<PreviewDisplayDialog
v-if=
"Object.keys(curPreviewObj).length > 0"
:visible=
"previewDialogVisible"
:displayDetail=
"curPreviewObj"
:loading=
"previewLoading"
@
handleClose=
"handleClosePreviewDialog"
@
refresh=
"loadData"
/>
@
refresh=
"loadData"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
</div>
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
PreviewDisplayDialog
from
'./components/PreviewDisplayDialog.vue'
import
{
displayTabletitle
,
operates
,
approvalOperations
,
viewOperations
}
from
"./config"
;
import
PreviewDisplayDialog
from
"./components/PreviewDisplayDialog.vue"
;
import
{
getListPer
,
getDisplayCheckById
,
}
from
"@/api/display"
;
import
SearchBar
from
"@/components/SearchBar"
;
displayTabletitle
,
operates
,
approvalOperations
,
viewOperations
,
}
from
"./config"
;
import
{
getListPer
,
getDisplayCheckById
}
from
"@/api/display"
;
import
{
mapGetters
}
from
"vuex"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
SearchBar
,
PreviewDisplayDialog
,
"el-image-viewer"
:
()
=>
import
(
"element-ui/packages/image/src/image-viewer"
),
},
data
()
{
let
that
=
this
;
...
...
@@ -101,7 +133,7 @@ export default {
size
:
10
,
current
:
1
,
total
:
0
,
}
}
,
],
searchConfig
:
[
{
...
...
@@ -115,21 +147,23 @@ export default {
previewDialogVisible
:
false
,
curPreviewObj
:
{},
//当前预览的对象
currentPageIds
:
[],
//当前的id数组,用于给详情页切换用
tabs
:
[{
name
:
'0'
,
label
:
'待审核'
},
{
name
:
'1'
,
label
:
'已通过'
tabs
:
[
{
name
:
"0"
,
label
:
"待审核"
,
},
{
name
:
'-2'
,
label
:
'已驳回'
}
name
:
"1"
,
label
:
"已通过"
,
},
{
name
:
"-2"
,
label
:
"已驳回"
,
},
],
activeName
:
'0'
,
activeName
:
"0"
,
currentTabIndex
:
0
,
dialogLoading
:
false
dialogLoading
:
false
,
};
},
computed
:
{
...
...
@@ -141,18 +175,18 @@ export default {
return
operates
;
},
tableOperations
()
{
if
(
this
.
activeName
==
'0'
)
{
return
approvalOperations
if
(
this
.
activeName
==
"0"
)
{
return
approvalOperations
;
}
else
{
return
viewOperations
}
return
viewOperations
;
}
},
},
watch
:
{
activeName
(
value
)
{
this
.
currentTabIndex
=
Number
(
Math
.
abs
(
value
))
//当前索引正好对应状态的绝对值
this
.
loadData
()
}
this
.
currentTabIndex
=
Number
(
Math
.
abs
(
value
))
;
//当前索引正好对应状态的绝对值
this
.
loadData
()
;
}
,
},
async
created
()
{
...
...
@@ -171,7 +205,7 @@ export default {
}
let
res
=
await
getListPer
(
params
);
if
(
res
.
code
==
0
)
{
this
.
$set
(
this
.
dataList
,
this
.
currentTabIndex
,
res
.
data
)
this
.
$set
(
this
.
dataList
,
this
.
currentTabIndex
,
res
.
data
)
;
// this.dataList[this.currentTabIndex] = res.data
// this.currentPageIds = this.dataList[this.currentTabIndex].records.map((item) => {
// return item.exhibitionId;
...
...
@@ -184,35 +218,36 @@ export default {
// 加载表格数据
async
loadData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
dataList
[
this
.
currentTabIndex
].
current
,
limit
:
this
.
dataList
[
this
.
currentTabIndex
].
size
,
checkStatus
:
Number
(
this
.
activeName
)
checkStatus
:
Number
(
this
.
activeName
)
,
};
let
res
=
await
getListPer
(
params
);
if
(
res
.
code
==
0
)
{
this
.
$set
(
this
.
dataList
,
this
.
currentTabIndex
,
res
.
data
)
this
.
$set
(
this
.
dataList
,
this
.
currentTabIndex
,
res
.
data
)
;
// this.currentPageIds = this.dataList[this.currentTabIndex].records.map((item) => {
// return item.exhibitionId;
// });
}
this
.
loading
=
false
this
.
loading
=
false
;
},
async
handleOperation
(
value
,
row
)
{
console
.
log
(
value
,
row
);
// debugger
if
(
value
.
type
==
'approval'
||
value
.
type
==
'view'
)
{
this
.
previewLoading
=
true
if
(
value
.
type
==
"approval"
||
value
.
type
==
"view"
)
{
this
.
previewLoading
=
true
;
if
(
row
)
{
this
.
previewDialogVisible
=
true
;
let
res
=
await
getDisplayCheckById
({
exhibitionId
:
row
.
exhibitionId
});
let
res
=
await
getDisplayCheckById
({
exhibitionId
:
row
.
exhibitionId
,
});
this
.
curPreviewObj
=
res
.
data
;
this
.
previewLoading
=
false
;
}
}
},
// 多选
...
...
@@ -256,7 +291,7 @@ export default {
handleClosePreviewDialog
()
{
this
.
previewDialogVisible
=
false
;
}
}
,
},
};
</
script
>
...
...
src/views/displayApproval/config.js
浏览文件 @
b24f538e
...
...
@@ -51,7 +51,7 @@ export const displayTabletitle = [{
prop
:
"literatureVo"
,
label
:
"关联文献"
,
columnAlign
:
'center'
,
width
:
100
width
:
100
},
{
prop
:
"themeType"
,
...
...
@@ -64,24 +64,24 @@ export const displayTabletitle = [{
columnAlign
:
'center'
,
showOverFlowToolTip
:
true
,
},
{
{
prop
:
"imagesVo"
,
label
:
"展览图片"
,
columnAlign
:
'center'
,
isImages
:
true
},
{
},
{
prop
:
"audiosVo"
,
label
:
"展览音频"
,
columnAlign
:
'center'
,
isAudios
:
true
},
{
},
{
prop
:
"videosVo"
,
label
:
"展览视频"
,
columnAlign
:
'center'
,
isVideos
:
true
},
},
]
export
const
operates
=
{
...
...
@@ -147,7 +147,7 @@ export const crTabletitle = [{
label
:
"类别"
,
width
:
100
,
columnAlign
:
'center'
,
isCulturalRelicType
:
true
isCulturalRelicType
:
true
},
{
prop
:
"createId"
,
...
...
@@ -193,25 +193,25 @@ export const crTabletitle = [{
isFaceImage
:
true
,
},
{
prop
:
"imagesVo"
,
prop
:
"imagesVo"
,
label
:
"文物图片"
,
columnAlign
:
'center'
,
isFaceImage
:
true
,
},
{
prop
:
"audiosVo"
,
prop
:
"audiosVo"
,
label
:
"文物音频"
,
columnAlign
:
'center'
,
isFaceImage
:
true
,
},
{
prop
:
"videosVo"
,
prop
:
"videosVo"
,
label
:
"文物视频"
,
columnAlign
:
'center'
,
isFaceImage
:
true
,
},
{
prop
:
"literatureVo"
,
prop
:
"literatureVo"
,
label
:
"相关文献"
,
columnAlign
:
'center'
,
isFaceImage
:
true
,
...
...
@@ -287,7 +287,7 @@ export const approvleTableTitle = [
columnAlign
:
'center'
,
},
{
prop
:
"
s
tatus"
,
prop
:
"
checkS
tatus"
,
label
:
"审核状态"
,
columnAlign
:
'center'
,
isStatus
:
true
...
...
src/views/displayApproval/index.vue
浏览文件 @
b24f538e
...
...
@@ -4,7 +4,7 @@
<SearchBar
:config=
"searchConfig"
@
search=
"search"
@
reset=
"reset"
/>
</div>
<TablePage
:data=
"
dataL
ist.records"
:data=
"
l
ist.records"
:tableTitle=
"approvleTableTitle"
:operates=
"operates"
v-loading=
"loading"
...
...
@@ -30,11 +30,11 @@
style=
"margin: 16px 0"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(
dataL
ist.current)"
:current-page=
"Number(
l
ist.current)"
:page-sizes=
"[10, 20, 50, 100]"
:page-size=
"Number(
dataL
ist.size)"
:page-size=
"Number(
l
ist.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(
dataL
ist.total)"
:total=
"Number(
l
ist.total)"
class=
"pagination"
>
</el-pagination>
...
...
@@ -50,25 +50,19 @@
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
PreviewDialog
from
"./components/PreviewDialog.vue"
;
import
{
approvleTableTitle
,
operates
,
operations
}
from
"./config"
;
import
{
getListPer
}
from
"@/api/display"
;
import
SearchBar
from
"@/components/SearchBar"
;
import
{
getFlowListPagePer
}
from
"@/api/approval"
;
import
{
mapGetters
}
from
"vuex"
;
import
{
approvalData
}
from
"./mock"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
SearchBar
,
PreviewDialog
,
},
data
()
{
let
that
=
this
;
return
{
dataL
ist
:
{
l
ist
:
{
record
:
[],
size
:
10
,
current
:
1
,
...
...
@@ -81,17 +75,17 @@ export default {
label
:
"标题"
,
},
{
prop
:
"
t
ype"
,
prop
:
"
sourceT
ype"
,
type
:
"select"
,
label
:
"类别"
,
selectOptions
:
[
{
label
:
"文物"
,
value
:
"
1
"
,
value
:
"
文物
"
,
},
{
label
:
"展览"
,
value
:
"
2
"
,
value
:
"
展览
"
,
},
],
},
...
...
@@ -129,41 +123,24 @@ export default {
},
methods
:
{
async
search
(
form
)
{
this
.
loadData
();
// var params = {
// page: 1,
// limit: this.dataList[this.currentTabIndex].size,
// ...form,
// };
// if (params.status == "") {
// delete params.status;
// }
// let res = await getListPer(params);
// if (res.code == 0) {
// this.$set(this.dataList, this.currentTabIndex, res.data);
// // this.dataList[this.currentTabIndex] = res.data
// // this.currentPageIds = this.dataList[this.currentTabIndex].records.map((item) => {
// // return item.exhibitionId;
// // });
// }
this
.
loadData
(
form
);
},
reset
()
{
this
.
loadData
();
},
// 加载表格数据
async
loadData
()
{
async
loadData
(
form
)
{
this
.
loading
=
true
;
this
.
dataList
=
approvalData
;
// var params = {
// page: this.dataList.current,
// limit: this.dataList.size,
// checkStatus: Number(this.activeName),
// };
// let res = await getListPer(params);
// if (res.code == 0) {
// this.$set(this.dataList, this.currentTabIndex, res.data);
// }
const
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
form
,
};
let
res
=
await
getFlowListPagePer
(
params
);
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
;
},
...
...
@@ -182,13 +159,13 @@ export default {
// 改变页容量
handleSizeChange
(
value
)
{
this
.
dataL
ist
[
this
.
currentTabIndex
].
size
=
value
;
this
.
l
ist
[
this
.
currentTabIndex
].
size
=
value
;
this
.
loadData
();
},
// 改变当前显示页
handleCurrentChange
(
value
)
{
this
.
dataL
ist
[
this
.
currentTabIndex
].
current
=
value
;
this
.
l
ist
[
this
.
currentTabIndex
].
current
=
value
;
this
.
loadData
();
},
...
...
src/views/importExport/index.vue
浏览文件 @
b24f538e
...
...
@@ -34,19 +34,10 @@
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
importRecordsTitle
,
importOperates
,
importOperations
}
from
"./config"
;
import
{
getImportListPage
,
deleteByBatchNum
}
from
"@/api/file"
;
import
SearchBar
from
"@/components/SearchBar"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
SearchBar
,
},
data
()
{
return
{
list
:
{
...
...
@@ -139,7 +130,7 @@ export default {
case
"view"
:
break
;
case
"delete"
:
let
{
batchNum
,
type
,
id
}
=
row
;
let
{
batchNum
,
type
,
id
}
=
row
;
let
deleteRes
=
await
deleteByBatchNum
({
batchNum
,
type
});
if
(
deleteRes
.
code
==
0
)
{
this
.
$message
.
success
(
"删除成功!"
);
...
...
src/views/literature/index.vue
浏览文件 @
b24f538e
...
...
@@ -59,20 +59,14 @@
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
{
editLiterature
,
deleteLt
}
from
"@/api/literature"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
import
SearchBar
from
"@/components/SearchBar"
;
import
{
downloadFile
,
previewFile
,
downloadBlob
}
from
"@/utils/file"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
InfoEditDialog
,
SearchBar
,
},
data
()
{
return
{
...
...
@@ -122,7 +116,7 @@ export default {
status
:
1
,
//上下架状态
remark
:
""
,
//备注
},
loading
:
false
loading
:
false
,
};
},
...
...
@@ -151,7 +145,7 @@ export default {
},
methods
:
{
async
search
(
form
)
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -164,7 +158,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
reset
()
{
...
...
@@ -173,7 +167,7 @@ export default {
// 加载表格数据
async
loadData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -182,7 +176,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
async
handleOperation
(
value
,
row
)
{
switch
(
value
.
type
)
{
...
...
@@ -190,7 +184,7 @@ export default {
this
.
drawerVisible
=
true
;
break
;
case
"view"
:
if
(
row
.
files
&&
row
.
files
.
length
>
0
&&
row
.
files
[
0
].
url
)
{
if
(
row
.
files
&&
row
.
files
.
length
>
0
&&
row
.
files
[
0
].
url
)
{
previewFile
(
row
.
files
[
0
].
url
,
row
.
name
);
}
else
{
let
m
=
this
.
$message
.
info
(
"暂无文献附件!"
);
...
...
src/views/log/index.vue
浏览文件 @
b24f538e
...
...
@@ -3,7 +3,12 @@
<div
class=
"top-bar"
>
<SearchBar
:config=
"searchConfig"
@
search=
"search"
@
reset=
"reset"
/>
</div>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
v-loading=
"loading"
>
</TablePage>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
v-loading=
"loading"
>
</TablePage>
<el-pagination
@
size-change=
"handleSizeChange"
...
...
@@ -20,19 +25,10 @@
</
template
>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
}
from
"./config"
;
import
{
getLogList
}
from
"@/api/log"
;
import
SearchBar
from
"@/components/SearchBar"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
SearchBar
,
},
data
()
{
return
{
list
:
{
...
...
@@ -156,7 +152,7 @@ export default {
label
:
"用户名"
,
},
],
loading
:
false
loading
:
false
,
};
},
...
...
@@ -182,7 +178,7 @@ export default {
},
methods
:
{
async
search
(
form
)
{
this
.
loading
=
true
this
.
loading
=
true
;
this
.
list
.
current
=
1
;
var
params
=
{
page
:
this
.
list
.
current
,
...
...
@@ -202,7 +198,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
reset
()
{
...
...
@@ -211,7 +207,7 @@ export default {
// 加载表格数据
async
loadData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -220,7 +216,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
// 改变页容量
...
...
@@ -249,7 +245,7 @@ export default {
margin
:
16px
;
}
::v-deep
.el-form-item
{
::v-deep
.el-form-item
{
margin-bottom
:
20px
;
}
</
style
>
src/views/museum/index.vue
浏览文件 @
b24f538e
...
...
@@ -112,20 +112,12 @@
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
import
SearchBar
from
"@/components/SearchBar"
;
import
{
deleteMuseum
,
editMuseum
}
from
"@/api/org"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
InfoEditDialog
,
SearchBar
,
"el-image-viewer"
:
()
=>
import
(
"element-ui/packages/image/src/image-viewer"
),
},
data
()
{
return
{
...
...
src/views/product/index.vue
浏览文件 @
b24f538e
...
...
@@ -2,57 +2,93 @@
<div
class=
"app-container"
>
<div
class=
"top-bar"
>
<SearchBar
:config=
"searchConfig"
@
search=
"search"
@
reset=
"reset"
/>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })" icon="el-icon-plus">
添加
</el-button>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })"
icon="el-icon-plus"
>
添加
</el-button
>
</div>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<template
v-slot:images=
"data"
>
<img
:src=
"$getFullUrl(data.scope.imagesVo[0].pressUrl)"
alt=
"暂无图片"
v-if=
"data.scope.imagesVo.length > 0"
style=
"
<img
:src=
"$getFullUrl(data.scope.imagesVo[0].pressUrl)"
alt=
"暂无图片"
v-if=
"data.scope.imagesVo.length > 0"
style=
"
cursor: pointer;
height: 100px;
width: 100px;
object-fit: contain;
"
width=
"100px"
@
click=
"
"
width=
"100px"
@
click=
"
handelPreviewImages($getFullUrl(data.scope.imagesVo[0].pressUrl))
"
/>
"
/>
</
template
>
<
template
v-slot:status=
"data"
>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
</el-popconfirm>
</
template
>
<
template
v-slot:operates=
"scope"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
</TableOperation>
</
template
>
</TablePage>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
</el-pagination>
<InfoEditDialog
:visible=
"drawerVisible"
:form=
"form"
:orgTreeData=
"orgTreeData"
@
handleClose=
"handleClose"
@
refresh=
"loadData"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
<InfoEditDialog
:visible=
"drawerVisible"
:form=
"form"
:orgTreeData=
"orgTreeData"
@
handleClose=
"handleClose"
@
refresh=
"loadData"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
</div>
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
{
getCcProduct
,
deleteCcProduct
}
from
"@/api/literature"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
import
SearchBar
from
"@/components/SearchBar"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
InfoEditDialog
,
SearchBar
,
"el-image-viewer"
:
()
=>
import
(
"element-ui/packages/image/src/image-viewer"
),
},
data
()
{
return
{
...
...
@@ -149,7 +185,7 @@ export default {
// 加载表格数据
async
loadData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -158,7 +194,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
loadOrgTree
()
{
this
.
$store
.
dispatch
(
"org/getMuseumTreeData"
,
true
).
then
((
res
)
=>
{
...
...
src/views/role/index.vue
浏览文件 @
b24f538e
...
...
@@ -65,21 +65,15 @@
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
{
getRoleList
,
getRoleById
,
deleteRole
,
upadateRole
}
from
"@/api/user"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
import
DataEditDialog
from
"./components/DataEditDialog"
;
import
SearchBar
from
"@/components/SearchBar"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
InfoEditDialog
,
DataEditDialog
,
SearchBar
,
},
data
()
{
return
{
...
...
@@ -120,12 +114,12 @@ export default {
name
:
""
,
remark
:
""
,
status
:
1
,
permissionRespNodes
:
[],
//菜单权限树
dataScope
:
5
,
//默认数据权限为自己
permissionRespNodes
:
[],
//菜单权限树
dataScope
:
5
,
//默认数据权限为自己
},
dataScopeForm
:
{},
//编辑数据权限的表单
dataScopeForm
:
{},
//编辑数据权限的表单
dataEditDialog
:
false
,
//编辑数据的对话框
loading
:
false
loading
:
false
,
};
},
...
...
@@ -155,7 +149,7 @@ export default {
},
methods
:
{
async
search
(
form
)
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -168,7 +162,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
reset
()
{
...
...
src/views/user/index.vue
浏览文件 @
b24f538e
...
...
@@ -2,56 +2,98 @@
<div
class=
"users app-container"
>
<el-row
:gutter=
"16"
>
<el-col
:span=
"4"
class=
"left-tree"
>
<el-scrollbar
style=
"height:100%;"
>
<el-tree
:data=
"treeData"
:props=
"defaultProps"
@
node-click=
"handleNodeClick"
default-expand-all
:expand-on-click-node=
"false"
></el-tree>
<el-scrollbar
style=
"height: 100%"
>
<el-tree
:data=
"treeData"
:props=
"defaultProps"
@
node-click=
"handleNodeClick"
default-expand-all
:expand-on-click-node=
"false"
></el-tree>
</el-scrollbar>
</el-col>
<el-col
:span=
"20"
>
<div
class=
"top-bar"
>
<SearchBar
:config=
"searchConfig"
@
search=
"search"
@
reset=
"reset"
/>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })" icon="el-icon-plus">
新增
</el-button>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })"
icon="el-icon-plus"
>
新增
</el-button
>
</div>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<template
v-slot:status=
"data"
>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
</el-popconfirm>
</
template
>
<
template
v-slot:operates=
"scope"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
</TableOperation>
</
template
>
</TablePage>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
</el-pagination>
</el-col>
</el-row>
<InfoEditDialog
:visible=
"dialogVisible"
:form=
"form"
:orgTreeData=
"treeData"
@
handleClose=
"handleClose"
@
refresh=
"loadListData"
/>
<EditRole
:visible=
"editRoleVisible"
:roleData=
"currentRoleData"
:id=
"currentId"
@
handleClose=
"handleCloseEditRole"
/>
<EditPassword
:visible=
"editPasswordVisible"
:id=
"currentId"
@
handleClose=
"handleCloseEditPassword"
/>
<InfoEditDialog
:visible=
"dialogVisible"
:form=
"form"
:orgTreeData=
"treeData"
@
handleClose=
"handleClose"
@
refresh=
"loadListData"
/>
<EditRole
:visible=
"editRoleVisible"
:roleData=
"currentRoleData"
:id=
"currentId"
@
handleClose=
"handleCloseEditRole"
/>
<EditPassword
:visible=
"editPasswordVisible"
:id=
"currentId"
@
handleClose=
"handleCloseEditPassword"
/>
</div>
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
SearchBar
from
"@/components/SearchBar"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
{
getDeptTree
,
getUserList
,
deleteUser
,
getUserOwnRoles
,
getUserOwnRolesV1
getUserOwnRolesV1
,
}
from
"@/api/user"
;
import
InfoEditDialog
from
"./components/InfoEditDialog.vue"
;
import
EditRole
from
"./components/EditRole.vue"
;
...
...
@@ -59,12 +101,9 @@ import EditPassword from "./components/EditPassword.vue";
export
default
{
components
:
{
TablePage
,
TableOperation
,
SearchBar
,
InfoEditDialog
,
EditRole
,
EditPassword
EditPassword
,
},
computed
:
{
tableTitle
()
{
...
...
@@ -127,7 +166,7 @@ export default {
editPasswordVisible
:
false
,
currentRoleData
:
{},
currentId
:
null
,
loading
:
false
loading
:
false
,
};
},
mounted
()
{
...
...
@@ -136,19 +175,16 @@ export default {
methods
:
{
// 加载树结构数据
async
loadTreeData
()
{
const
res
=
await
getDeptTree
();
if
(
res
.
code
==
0
)
{
this
.
treeData
=
res
.
data
[
0
].
children
;
//去除默认顶级部门
this
.
currentDeptNo
=
this
.
treeData
[
0
].
deptNo
;
this
.
loadListData
();
}
},
// 加载表格数据
async
loadListData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -158,7 +194,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
async
search
(
form
)
{
...
...
@@ -217,8 +253,8 @@ export default {
this
.
currentRoleData
=
roleRes
.
data
;
this
.
currentId
=
row
.
id
;
break
;
case
'editPassword'
:
console
.
log
(
'editPassword'
);
case
"editPassword"
:
console
.
log
(
"editPassword"
);
this
.
editPasswordVisible
=
true
;
this
.
currentId
=
row
.
id
;
break
;
...
...
@@ -237,10 +273,10 @@ export default {
this
.
currentId
=
null
;
},
handleCloseEditPassword
(){
handleCloseEditPassword
()
{
this
.
editPasswordVisible
=
false
;
this
.
currentId
=
null
;
}
}
,
},
};
</
script
>
...
...
src/views/virtual/index.vue
浏览文件 @
b24f538e
...
...
@@ -2,51 +2,86 @@
<div
class=
"app-container"
>
<div
class=
"top-bar"
>
<SearchBar
:config=
"searchConfig"
@
search=
"search"
@
reset=
"reset"
/>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })" icon="el-icon-plus">
添加
</el-button>
<el-button
size=
"mini"
type=
"primary"
@
click
.
native=
"handleOperation(
{ type: 'add' })"
icon="el-icon-plus"
>
添加
</el-button
>
</div>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<TablePage
:data=
"list.records"
:tableTitle=
"tableTitle"
:operates=
"tableOperates"
v-loading=
"loading"
>
<template
v-slot:faceImageUrl=
"data"
>
<img
:src=
"data.scope.faceImageUrl"
alt=
"暂无图片"
v-if=
"data.scope.faceImageUrl"
style=
"cursor: pointer"
width=
"100px"
@
click=
"handelPreviewImages(data.scope.faceImageUrl)"
/>
<img
:src=
"data.scope.faceImageUrl"
alt=
"暂无图片"
v-if=
"data.scope.faceImageUrl"
style=
"cursor: pointer"
width=
"100px"
@
click=
"handelPreviewImages(data.scope.faceImageUrl)"
/>
</
template
>
<
template
v-slot:status=
"data"
>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
<el-popconfirm
:title=
"getStatusTitle(data.scope.status)"
@
confirm=
"handleChangeStatus(data.scope)"
>
<el-switch
slot=
"reference"
:value=
"Boolean(Number(data.scope.status))"
></el-switch>
</el-popconfirm>
</
template
>
<
template
v-slot:operates=
"scope"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
<TableOperation
:operations=
"tableOperations"
:rawData=
"scope.scope.row"
@
handleOperation=
"handleOperation"
>
</TableOperation>
</
template
>
</TablePage>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
<el-pagination
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"Number(list.current)"
:page-sizes=
"[10, 20, 40, 50]"
:page-size=
"Number(list.size)"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"Number(list.total)"
class=
"pagination"
>
</el-pagination>
<InfoEditDialog
:visible=
"drawerVisible"
:form=
"form"
:orgTreeData=
"orgTreeData"
@
handleClose=
"handleClose"
@
refresh=
"loadData"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
<InfoEditDialog
:visible=
"drawerVisible"
:form=
"form"
:orgTreeData=
"orgTreeData"
@
handleClose=
"handleClose"
@
refresh=
"loadData"
/>
<el-image-viewer
v-if=
"imgViewerVisible"
:on-close=
"closeImgViewer"
:url-list=
"imgList"
/>
</div>
</template>
<
script
>
import
TablePage
from
"@/components/Table/TablePage.vue"
;
import
TableOperation
from
"@/components/Table/TableOperation.vue"
;
import
{
title
,
operates
,
operations
}
from
"./config"
;
import
{
deleteVirtual
,
editVirtual
,
getVirtualListPer
}
from
"@/api/vitual"
;
import
InfoEditDialog
from
"./components/InfoEditDialog"
;
import
SearchBar
from
"@/components/SearchBar"
;
export
default
{
components
:
{
TablePage
,
TableOperation
,
InfoEditDialog
,
SearchBar
,
"el-image-viewer"
:
()
=>
import
(
"element-ui/packages/image/src/image-viewer"
),
},
data
()
{
return
{
...
...
@@ -124,7 +159,7 @@ export default {
},
methods
:
{
async
search
(
form
)
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -137,7 +172,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
reset
()
{
...
...
@@ -146,7 +181,7 @@ export default {
// 加载表格数据
async
loadData
()
{
this
.
loading
=
true
this
.
loading
=
true
;
var
params
=
{
page
:
this
.
list
.
current
,
limit
:
this
.
list
.
size
,
...
...
@@ -155,7 +190,7 @@ export default {
if
(
res
.
code
==
0
)
{
this
.
list
=
res
.
data
;
}
this
.
loading
=
false
this
.
loading
=
false
;
},
loadOrgTree
()
{
this
.
$store
.
dispatch
(
"org/getMuseumTreeData"
,
true
).
then
((
res
)
=>
{
...
...
vue.config.js
浏览文件 @
b24f538e
...
...
@@ -31,7 +31,7 @@ module.exports = {
lintOnSave
:
false
,
productionSourceMap
:
false
,
devServer
:
{
host
:
'
localhost
'
,
host
:
'
172.24.100.158
'
,
port
:
port
,
open
:
true
,
overlay
:
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论