Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
2f275d26
authored
Aug 07, 2025
by
lijinqi
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/develop' into develop
parents
a24dc334
e833565b
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
657 additions
and
87 deletions
+657
-87
src/api/biz/bannerinfo/index.ts
+8
-1
src/api/biz/industryapplication/index.ts
+3
-4
src/locales/zh-CN.ts
+9
-1
src/views/biz/bannerinfo/BannerInfoForm.vue
+111
-8
src/views/biz/bannerinfo/index.vue
+55
-32
src/views/biz/computilityinformation/ComputilityInformationForm.vue
+113
-7
src/views/biz/computilityinformation/index.vue
+17
-4
src/views/biz/industryapplication/IndustryApplicationForm.vue
+181
-12
src/views/biz/industryapplication/index.vue
+33
-7
src/views/biz/information/InformationForm.vue
+111
-7
src/views/biz/information/index.vue
+16
-4
No files found.
src/api/biz/bannerinfo/index.ts
View file @
2f275d26
...
...
@@ -49,5 +49,12 @@ export const BannerInfoApi = {
// 导出banner页管理 Excel
exportBannerInfo
:
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/biz/banner-info/export-excel`
,
params
})
}
},
// //图片上传
// uploadImage: async (file: File) => {
// const formData = new FormData();
// formData.append('file', file);
// return await request.post({ url: `/biz/banner-info/upload`, data: formData });
// }
}
src/api/biz/industryapplication/index.ts
View file @
2f275d26
...
...
@@ -4,14 +4,14 @@ import type { Dayjs } from 'dayjs';
/** 行业应用信息 */
export
interface
IndustryApplication
{
id
:
number
;
// 主键
image
:
string
;
// 展示图地址
image
s
:
string
;
// 展示图地址
information
?:
string
;
// 内容
title
?:
string
;
// 标题
url
:
string
;
// 链接地址
description
:
string
;
// 描述内容
showStatus
?:
boolean
;
// 状态:0-已隐藏,1-已显示
remark
:
string
;
// 备注
homeImage
:
string
;
// 首页展示图片
homeImage
s
:
string
;
// 首页展示图片
assemblyType
:
number
;
// 组件类型:0-全部
orderNum
:
number
;
// 排序值
}
...
...
@@ -52,4 +52,4 @@ export const IndustryApplicationApi = {
exportIndustryApplication
:
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/biz/industry-application/export-excel`
,
params
})
}
}
\ No newline at end of file
}
src/locales/zh-CN.ts
View file @
2f275d26
...
...
@@ -312,7 +312,15 @@ export default {
typeCreate
:
'字典类型新增'
,
typeUpdate
:
'字典类型编辑'
,
dataCreate
:
'字典数据新增'
,
dataUpdate
:
'字典数据编辑'
dataUpdate
:
'字典数据编辑'
,
bannerCreate
:
'添加banner页管理'
,
bannerUpdate
:
'修改banner页管理'
,
computilityCreate
:
'添加计算资源首页管理'
,
computilityUpdate
:
'修改计算资源首页管理'
,
assemblyCreate
:
'添加组件管理'
,
assemblyUpdate
:
'修改组件管理'
,
informationCreate
:
'添加活动资源管理'
,
informationUpdate
:
'修改活动资源管理'
,
},
dialog
:
{
dialog
:
'弹窗'
,
...
...
src/views/biz/bannerinfo/BannerInfoForm.vue
View file @
2f275d26
...
...
@@ -7,9 +7,33 @@
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"轮播图地址"
prop=
"image"
>
<UploadImg
v-model=
"formData.image"
/>
<!--
<el-form-item
label=
"轮播图地址"
prop=
"image"
>
-->
<!--
<UploadImg
v-model=
"formData.image"
/>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"轮播图地址"
prop=
"images"
>
<el-upload
v-model:file-list=
"formData.images"
:action=
"uploadUrl"
:http-request=
"httpRequest"
list-type=
"picture-card"
:on-preview=
"handlePictureCardPreview"
:on-remove=
"handleRemove"
:on-success=
"handleUploadSuccess"
:on-error=
"handleUploadError"
multiple
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
<!-- 添加预览对话框 -->
<el-dialog
v-model=
"previewVisible"
append-to-body
>
<img
style=
"width: 100%"
:src=
"dialogImageUrl"
alt=
"Preview Image"
/>
</el-dialog>
<!-- 添加提示信息 -->
<p
class=
"upload-tips"
>
请上传 大小不超过
<span
class=
"red-text"
>
5MB
</span>
格式为
<span
class=
"red-text"
>
png/jpg/jpeg
</span>
的文件
</p>
</el-form-item>
<el-form-item
label=
"内容"
prop=
"information"
>
<el-input
v-model=
"formData.information"
placeholder=
"请输入内容"
/>
</el-form-item>
...
...
@@ -55,6 +79,7 @@
<
script
setup
lang=
"ts"
>
import
{
BannerInfoApi
,
BannerInfo
}
from
'@/api/biz/bannerinfo'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
useUpload
}
from
'@/components/UploadFile/src/useUpload'
/** banner页管理 表单 */
defineOptions
({
name
:
'BannerInfoForm'
})
...
...
@@ -62,13 +87,20 @@ defineOptions({ name: 'BannerInfoForm' })
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
// 添加预览相关的响应式变量
const
previewVisible
=
ref
(
false
)
// 获取上传相关配置
const
{
uploadUrl
,
httpRequest
}
=
useUpload
()
const
dialogImageUrl
=
ref
(
''
)
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
image
:
undefined
,
image
s
:
[],
// 改为数组,存储多张图片的地址
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
...
...
@@ -80,7 +112,8 @@ const formData = ref({
const
formRules
=
reactive
({
information
:
[{
required
:
true
,
message
:
'内容不能为空'
,
trigger
:
'blur'
}],
title
:
[{
required
:
true
,
message
:
'标题不能为空'
,
trigger
:
'blur'
}],
showStatus
:
[{
required
:
true
,
message
:
'状态:0-已隐藏,1-已显示不能为空'
,
trigger
:
'blur'
}]
showStatus
:
[{
required
:
true
,
message
:
'状态:0-已隐藏,1-已显示不能为空'
,
trigger
:
'blur'
}],
orderNum
:
[{
required
:
true
,
message
:
'排序值不能为空'
,
trigger
:
'blur'
}],
})
const
formRef
=
ref
()
// 表单 Ref
...
...
@@ -100,7 +133,14 @@ const open = async (type: string, id?: number) => {
if
(
data
.
description
===
null
)
{
data
.
description
=
''
}
formData
.
value
=
data
// 将 images 字段转换为 file-list 需要的格式
if
(
data
.
images
&&
Array
.
isArray
(
data
.
images
))
{
formData
.
value
.
images
=
data
.
images
.
map
(
url
=>
({
url
,
name
:
'image.jpg'
}))
// 添加 name 属性
}
else
{
formData
.
value
.
images
=
[]
}
formData
.
value
=
{
...
data
,
images
:
formData
.
value
.
images
}
// 确保 image 是数组
}
finally
{
formLoading
.
value
=
false
}
...
...
@@ -116,8 +156,26 @@ const submitForm = async () => {
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
formData
.
value
as
unknown
as
BannerInfo
if
(
formType
.
value
===
'create'
)
{
// 确保只提取真实的 URL,而不是本地的 Blob URL
const
imageUrls
=
formData
.
value
.
images
.
filter
(
item
=>
item
.
url
&&
!
item
.
url
.
startsWith
(
'blob:'
))
// 过滤掉 Blob URL
.
map
(
item
=>
item
.
url
);
// 如果还有 Blob URL,说明有文件还未上传完成
const
hasBlobUrls
=
formData
.
value
.
images
.
some
(
item
=>
item
.
url
&&
item
.
url
.
startsWith
(
'blob:'
));
if
(
hasBlobUrls
)
{
message
.
warning
(
'请等待图片上传完成后再提交'
);
formLoading
.
value
=
false
;
return
;
}
// 构造最终数据
const
data
=
{
...
formData
.
value
,
images
:
imageUrls
};
if
(
formType
.
value
===
'bannerCreate'
)
{
await
BannerInfoApi
.
createBannerInfo
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
...
...
@@ -136,7 +194,7 @@ const submitForm = async () => {
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
...
...
@@ -147,4 +205,49 @@ const resetForm = () => {
}
formRef
.
value
?.
resetFields
()
}
// 预览图片
const
handlePictureCardPreview
=
(
file
)
=>
{
dialogImageUrl
.
value
=
file
.
url
previewVisible
.
value
=
true
// 使用独立的预览状态
}
// 删除图片
const
handleRemove
=
(
file
,
fileList
)
=>
{
// 更新 formData.image 数组
// formData.value.images = fileList.map(item => ({ url: item.url, name: item.name }))
formData
.
value
.
images
=
fileList
}
// 上传成功处理函数
const
handleUploadSuccess
=
(
response
,
file
,
fileList
)
=>
{
// 从响应中提取真实的URL并更新文件对象
if
(
response
&&
response
.
data
)
{
// 根据 useUpload.ts 的实现,可能是 response.data.url 或直接是 response.data
const
realUrl
=
response
.
data
.
url
||
response
.
data
;
if
(
realUrl
)
{
file
.
url
=
realUrl
;
}
}
// 更新 formData.images
formData
.
value
.
images
=
fileList
;
}
// 上传失败处理函数
const
handleUploadError
=
(
err
,
file
,
fileList
)
=>
{
message
.
error
(
'图片上传失败: '
+
(
err
.
message
||
'未知错误'
))
}
</
script
>
<
style
scoped
>
.upload-tips
{
font-size
:
12px
;
color
:
#999
;
margin-top
:
10px
;
}
.red-text
{
color
:
red
;
}
</
style
>
src/views/biz/bannerinfo/index.vue
View file @
2f275d26
...
...
@@ -14,7 +14,7 @@
placeholder=
"请输入内容"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-
16
0px"
class=
"!w-
20
0px"
/>
</el-form-item>
<el-form-item
label=
"标题"
prop=
"title"
>
...
...
@@ -23,21 +23,30 @@
placeholder=
"请输入标题"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-
16
0px"
class=
"!w-
20
0px"
/>
</el-form-item>
<el-form-item
label=
"
排序值"
prop=
"orderNum
"
>
<el-form-item
label=
"
链接地址"
prop=
"url
"
>
<el-input
v-model=
"queryParams.
orderNum
"
placeholder=
"请输入
排序值
"
v-model=
"queryParams.
url
"
placeholder=
"请输入
链接地址
"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-
16
0px"
class=
"!w-
20
0px"
/>
</el-form-item>
<!--
<el-form-item
label=
"排序值"
prop=
"orderNum"
>
-->
<!--
<el-input-->
<!-- v-model="queryParams.orderNum"-->
<!-- placeholder="请输入排序值"-->
<!-- clearable-->
<!-- @keyup.enter="handleQuery"-->
<!-- class="!w-160px"-->
<!-- />-->
<!--
</el-form-item>
-->
<el-form-item
label=
"状态"
prop=
"showStatus"
>
<el-select
v-model=
"queryParams.showStatus"
placeholder=
"请选择状态"
clearable
class=
"!w-
12
0px"
>
<el-select
v-model=
"queryParams.showStatus"
placeholder=
"请选择状态"
clearable
class=
"!w-
20
0px"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.HOME_INFO_STATUS)"
:key=
"dict.value"
...
...
@@ -57,33 +66,33 @@
<!--
<el-option
label=
"请选择字典生成"
value=
""
/>
-->
<!--
</el-select>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
<el-date-picker
v-model=
"queryParams.createTime"
value-format=
"YYYY-MM-DD HH:mm:ss"
type=
"daterange"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
:default-time=
"[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class=
"!w-220px"
/
>
</el-form-item
>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"queryParams.remark"
placeholder=
"请输入备注"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/
>
</el-form-item
>
<!--
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
--
>
<!--
<el-date-picker-->
<!-- v-model="queryParams.createTime"-->
<!-- value-format="YYYY-MM-DD HH:mm:ss"-->
<!-- type="daterange"-->
<!-- start-placeholder="开始日期"-->
<!-- end-placeholder="结束日期"-->
<!-- :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"-->
<!-- class="!w-220px"-->
<!-- />--
>
<!--
</el-form-item>
--
>
<!--
<el-form-item
label=
"备注"
prop=
"remark"
>
--
>
<!--
<el-input-->
<!-- v-model="queryParams.remark"-->
<!-- placeholder="请输入备注"-->
<!-- clearable-->
<!-- @keyup.enter="handleQuery"-->
<!-- class="!w-240px"-->
<!-- />--
>
<!--
</el-form-item>
--
>
<el-form-item>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
type=
"primary"
plain
@
click=
"openForm('
c
reate')"
@
click=
"openForm('
bannerC
reate')"
v-hasPermi=
"['biz:banner-info:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
...
...
@@ -123,11 +132,24 @@
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
label=
"排序值"
align=
"center"
prop=
"orderNum"
/>
<!--
<el-table-column
label=
"轮播图地址"
align=
"center"
prop=
"image"
/>
-->
<el-table-column
label=
"轮播图地址"
align=
"center"
prop=
"image"
width=
"100"
>
<!--
<el-table-column
label=
"轮播图地址"
align=
"center"
prop=
"images"
width=
"100"
>
-->
<!--
<template
#
default=
"scope"
>
-->
<!--
<img
:src=
"scope.row.images"
alt=
"轮播图"
class=
"h-36px"
/>
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<el-table-column
label=
"轮播图地址"
align=
"center"
prop=
"images"
width=
"100"
>
<
template
#
default=
"scope"
>
<img
:src=
"scope.row.image"
alt=
"轮播图"
class=
"h-36px"
/>
<!-- 只显示第一张图片 -->
<img
v-if=
"scope.row.images && scope.row.images.length > 0"
:src=
"scope.row.images[0]"
alt=
"轮播图"
class=
"h-36px"
/>
<span
v-else
>
暂无图片
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"内容"
align=
"center"
prop=
"information"
/>
<el-table-column
label=
"标题"
align=
"center"
prop=
"title"
/>
<el-table-column
label=
"链接地址"
align=
"center"
prop=
"url"
/>
...
...
@@ -152,7 +174,7 @@
<el-button
link
type=
"primary"
@
click=
"openForm('
u
pdate', scope.row.id)"
@
click=
"openForm('
bannerU
pdate', scope.row.id)"
v-hasPermi=
"['biz:banner-info:update']"
>
编辑
...
...
@@ -207,7 +229,8 @@ const queryParams = reactive({
orderNum
:
undefined
,
showStatus
:
undefined
,
createTime
:
[],
remark
:
undefined
remark
:
undefined
,
url
:
undefined
,
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
exportLoading
=
ref
(
false
)
// 导出的加载中
...
...
src/views/biz/computilityinformation/ComputilityInformationForm.vue
View file @
2f275d26
...
...
@@ -7,9 +7,33 @@
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"展示图地址"
prop=
"image"
>
<UploadImg
v-model=
"formData.image"
/>
<!--
<el-form-item
label=
"展示图地址"
prop=
"images"
>
-->
<!--
<UploadImg
v-model=
"formData.images"
/>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"轮播图地址"
prop=
"images"
>
<el-upload
v-model:file-list=
"formData.images"
:action=
"uploadUrl"
:http-request=
"httpRequest"
list-type=
"picture-card"
:on-preview=
"handlePictureCardPreview"
:on-remove=
"handleRemove"
:on-success=
"handleUploadSuccess"
:on-error=
"handleUploadError"
multiple
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
<!-- 添加预览对话框 -->
<el-dialog
v-model=
"previewVisible"
append-to-body
>
<img
style=
"width: 100%"
:src=
"dialogImageUrl"
alt=
"Preview Image"
/>
</el-dialog>
<!-- 添加提示信息 -->
<p
class=
"upload-tips"
>
请上传 大小不超过
<span
class=
"red-text"
>
5MB
</span>
格式为
<span
class=
"red-text"
>
png/jpg/jpeg
</span>
的文件
</p>
</el-form-item>
<el-form-item
label=
"内容"
prop=
"information"
>
<el-input
v-model=
"formData.information"
placeholder=
"请输入内容"
/>
</el-form-item>
...
...
@@ -71,6 +95,15 @@
import
{
ComputilityInformationApi
,
ComputilityInformation
}
from
'@/api/biz/computilityinformation'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
useUpload
}
from
'@/components/UploadFile/src/useUpload'
// 添加预览相关的响应式变量
const
previewVisible
=
ref
(
false
)
// 获取上传相关配置
const
{
uploadUrl
,
httpRequest
}
=
useUpload
()
const
dialogImageUrl
=
ref
(
''
)
/** 计算资源首页管理 表单 */
defineOptions
({
name
:
'ComputilityInformationForm'
})
...
...
@@ -83,7 +116,7 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
...
...
@@ -116,7 +149,15 @@ const open = async (type: string, id?: number) => {
if
(
data
.
description
===
null
)
{
data
.
description
=
''
}
formData
.
value
=
data
// 将 images 字段转换为 file-list 需要的格式
if
(
data
.
images
&&
Array
.
isArray
(
data
.
images
))
{
formData
.
value
.
images
=
data
.
images
.
map
(
url
=>
({
url
,
name
:
'image.jpg'
}))
// 添加 name 属性
}
else
{
formData
.
value
.
images
=
[]
}
formData
.
value
=
{
...
data
,
images
:
formData
.
value
.
images
}
// 确保 image 是数组
}
finally
{
formLoading
.
value
=
false
}
...
...
@@ -132,8 +173,27 @@ const submitForm = async () => {
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
formData
.
value
as
unknown
as
ComputilityInformation
if
(
formType
.
value
===
'create'
)
{
// 确保只提取真实的 URL,而不是本地的 Blob URL
const
imageUrls
=
formData
.
value
.
images
.
filter
(
item
=>
item
.
url
&&
!
item
.
url
.
startsWith
(
'blob:'
))
// 过滤掉 Blob URL
.
map
(
item
=>
item
.
url
);
// 如果还有 Blob URL,说明有文件还未上传完成
const
hasBlobUrls
=
formData
.
value
.
images
.
some
(
item
=>
item
.
url
&&
item
.
url
.
startsWith
(
'blob:'
));
if
(
hasBlobUrls
)
{
message
.
warning
(
'请等待图片上传完成后再提交'
);
formLoading
.
value
=
false
;
return
;
}
// 构造最终数据
const
data
=
{
...
formData
.
value
,
images
:
imageUrls
};
if
(
formType
.
value
===
'computilityCreate'
)
{
await
ComputilityInformationApi
.
createComputilityInformation
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
...
...
@@ -152,7 +212,7 @@ const submitForm = async () => {
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
...
...
@@ -163,4 +223,50 @@ const resetForm = () => {
}
formRef
.
value
?.
resetFields
()
}
// 预览图片
const
handlePictureCardPreview
=
(
file
)
=>
{
dialogImageUrl
.
value
=
file
.
url
previewVisible
.
value
=
true
// 使用独立的预览状态
}
// 删除图片
const
handleRemove
=
(
file
,
fileList
)
=>
{
// 更新 formData.image 数组
// formData.value.images = fileList.map(item => ({ url: item.url, name: item.name }))
formData
.
value
.
images
=
fileList
}
// 上传成功处理函数
const
handleUploadSuccess
=
(
response
,
file
,
fileList
)
=>
{
// 从响应中提取真实的URL并更新文件对象
if
(
response
&&
response
.
data
)
{
// 根据 useUpload.ts 的实现,可能是 response.data.url 或直接是 response.data
const
realUrl
=
response
.
data
.
url
||
response
.
data
;
if
(
realUrl
)
{
file
.
url
=
realUrl
;
}
}
// 更新 formData.images
formData
.
value
.
images
=
fileList
;
}
// 上传失败处理函数
const
handleUploadError
=
(
err
,
file
,
fileList
)
=>
{
message
.
error
(
'图片上传失败: '
+
(
err
.
message
||
'未知错误'
))
}
</
script
>
<
style
scoped
>
.upload-tips
{
font-size
:
12px
;
color
:
#999
;
margin-top
:
10px
;
}
.red-text
{
color
:
red
;
}
</
style
>
src/views/biz/computilityinformation/index.vue
View file @
2f275d26
...
...
@@ -96,7 +96,7 @@
<el-button
type=
"primary"
plain
@
click=
"openForm('create')"
@
click=
"openForm('c
omputilityC
reate')"
v-hasPermi=
"['biz:computility-information:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
...
...
@@ -135,11 +135,24 @@
>
<el-table-column
type=
"selection"
width=
"55"
/>
<!--
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"image"
/>
-->
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"image"
width=
"100"
>
<!--
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"images"
width=
"100"
>
-->
<!--
<template
#
default=
"scope"
>
-->
<!--
<img
:src=
"scope.row.images"
alt=
"资源展示图"
class=
"h-36px"
/>
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"images"
width=
"100"
>
<
template
#
default=
"scope"
>
<img
:src=
"scope.row.image"
alt=
"资源展示图"
class=
"h-36px"
/>
<!-- 只显示第一张图片 -->
<img
v-if=
"scope.row.images && scope.row.images.length > 0"
:src=
"scope.row.images[0]"
alt=
"展示图"
class=
"h-36px"
/>
<span
v-else
>
暂无图片
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"内容"
align=
"center"
prop=
"information"
/>
<el-table-column
label=
"标题"
align=
"center"
prop=
"title"
/>
<el-table-column
label=
"链接地址"
align=
"center"
prop=
"url"
/>
...
...
@@ -170,7 +183,7 @@
<el-button
link
type=
"primary"
@
click=
"openForm('
u
pdate', scope.row.id)"
@
click=
"openForm('
computilityU
pdate', scope.row.id)"
v-hasPermi=
"['biz:computility-information:update']"
>
编辑
...
...
src/views/biz/industryapplication/IndustryApplicationForm.vue
View file @
2f275d26
...
...
@@ -7,9 +7,33 @@
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"展示图地址"
prop=
"image"
>
<UploadImg
v-model=
"formData.image"
/>
<!--
<el-form-item
label=
"展示图地址"
prop=
"image"
>
-->
<!--
<UploadImg
v-model=
"formData.image"
/>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"轮播图地址"
prop=
"images"
>
<el-upload
v-model:file-list=
"formData.images"
:action=
"uploadUrl"
:http-request=
"httpRequest"
list-type=
"picture-card"
:on-preview=
"handlePictureCardPreview"
:on-remove=
"handleRemove"
:on-success=
"handleUploadSuccess"
:on-error=
"handleUploadError"
multiple
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
<!-- 添加预览对话框 -->
<el-dialog
v-model=
"previewVisible"
append-to-body
>
<img
style=
"width: 100%"
:src=
"dialogImageUrl"
alt=
"Preview Image"
/>
</el-dialog>
<!-- 添加提示信息 -->
<p
class=
"upload-tips"
>
请上传 大小不超过
<span
class=
"red-text"
>
5MB
</span>
格式为
<span
class=
"red-text"
>
png/jpg/jpeg
</span>
的文件
</p>
</el-form-item>
<el-form-item
label=
"内容"
prop=
"information"
>
<el-input
v-model=
"formData.information"
placeholder=
"请输入内容"
/>
</el-form-item>
...
...
@@ -38,8 +62,31 @@
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
</el-form-item>
<el-form-item
label=
"首页展示图片"
prop=
"homeImage"
>
<UploadImg
v-model=
"formData.homeImage"
/>
<!--
<el-form-item
label=
"首页展示图片"
prop=
"homeImage"
>
-->
<!--
<UploadImg
v-model=
"formData.homeImage"
/>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"首页展示图片"
prop=
"homeImages"
>
<el-upload
v-model:file-list=
"formData.homeImages"
:action=
"uploadUrl"
:http-request=
"httpRequest"
list-type=
"picture-card"
:on-preview=
"handlePictureCardPreview"
:on-remove=
"handleRemoveHomeImage"
:on-success=
"handleUploadHomeImageSuccess"
:on-error=
"handleUploadError"
multiple
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
<!-- 添加预览对话框 -->
<el-dialog
v-model=
"previewVisible"
append-to-body
>
<img
style=
"width: 100%"
:src=
"dialogImageUrl"
alt=
"Preview Image"
/>
</el-dialog>
<!-- 添加提示信息 -->
<p
class=
"upload-tips"
>
请上传 大小不超过
<span
class=
"red-text"
>
5MB
</span>
格式为
<span
class=
"red-text"
>
png/jpg/jpeg
</span>
的文件
</p>
</el-form-item>
<!--
<el-form-item
label=
"组件类型:0-全部"
prop=
"assemblyType"
>
-->
<!--
<el-select
v-model=
"formData.assemblyType"
placeholder=
"请选择组件类型:0-全部"
>
-->
...
...
@@ -72,6 +119,15 @@
import
{
IndustryApplicationApi
,
IndustryApplication
}
from
'@/api/biz/industryapplication'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
useUpload
}
from
'@/components/UploadFile/src/useUpload'
// 添加预览相关的响应式变量
const
previewVisible
=
ref
(
false
)
// 获取上传相关配置
const
{
uploadUrl
,
httpRequest
}
=
useUpload
()
const
dialogImageUrl
=
ref
(
''
)
/** 行业应用 表单 */
defineOptions
({
name
:
'IndustryApplicationForm'
})
...
...
@@ -84,21 +140,22 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
description
:
''
,
showStatus
:
undefined
,
remark
:
undefined
,
homeImage
:
undefined
,
homeImage
s
:
[]
,
assemblyType
:
undefined
,
orderNum
:
undefined
})
const
formRules
=
reactive
({
information
:
[{
required
:
true
,
message
:
'内容不能为空'
,
trigger
:
'blur'
}],
title
:
[{
required
:
true
,
message
:
'标题不能为空'
,
trigger
:
'blur'
}],
showStatus
:
[{
required
:
true
,
message
:
'状态:0-已隐藏,1-已显示不能为空'
,
trigger
:
'blur'
}]
showStatus
:
[{
required
:
true
,
message
:
'状态:0-已隐藏,1-已显示不能为空'
,
trigger
:
'blur'
}],
orderNum
:
[{
required
:
true
,
message
:
'排序值不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
...
...
@@ -118,7 +175,21 @@ const open = async (type: string, id?: number) => {
if
(
data
.
description
===
null
)
{
data
.
description
=
''
}
formData
.
value
=
data
// 将 images 字段转换为 file-list 需要的格式
if
(
data
.
images
&&
Array
.
isArray
(
data
.
images
))
{
formData
.
value
.
images
=
data
.
images
.
map
(
url
=>
({
url
,
name
:
'image.jpg'
}))
// 添加 name 属性
}
else
{
formData
.
value
.
images
=
[]
}
// 将 homeImages 字段转换为 file-list 需要的格式
if
(
data
.
homeImages
&&
Array
.
isArray
(
data
.
homeImages
))
{
formData
.
value
.
homeImages
=
data
.
homeImages
.
map
(
url
=>
({
url
,
name
:
'homeImages.jpg'
}))
// 添加 name 属性
}
else
{
formData
.
value
.
homeImages
=
[]
}
formData
.
value
=
{
...
data
,
images
:
formData
.
value
.
images
,
homeImages
:
formData
.
value
.
homeImages
}
// 确保 image 是数组
}
finally
{
formLoading
.
value
=
false
}
...
...
@@ -134,8 +205,39 @@ const submitForm = async () => {
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
formData
.
value
as
unknown
as
IndustryApplication
if
(
formType
.
value
===
'create'
)
{
// 确保只提取真实的 URL,而不是本地的 Blob URL
const
imageUrls
=
formData
.
value
.
images
.
filter
(
item
=>
item
.
url
&&
!
item
.
url
.
startsWith
(
'blob:'
))
// 过滤掉 Blob URL
.
map
(
item
=>
item
.
url
);
// 确保只提取真实的 URL,而不是本地的 Blob URL
const
homeImageUrls
=
formData
.
value
.
homeImages
.
filter
(
item
=>
item
.
url
&&
!
item
.
url
.
startsWith
(
'blob:'
))
// 过滤掉 Blob URL
.
map
(
item
=>
item
.
url
);
// 如果还有 Blob URL,说明有文件还未上传完成
const
hasBlobUrls
=
formData
.
value
.
images
.
some
(
item
=>
item
.
url
&&
item
.
url
.
startsWith
(
'blob:'
));
if
(
hasBlobUrls
)
{
message
.
warning
(
'请等待图片上传完成后再提交'
);
formLoading
.
value
=
false
;
return
;
}
// 如果还有 Blob URL,说明有文件还未上传完成
const
hasBlobUrls_2
=
formData
.
value
.
homeImages
.
some
(
item
=>
item
.
url
&&
item
.
url
.
startsWith
(
'blob:'
));
if
(
hasBlobUrls_2
)
{
message
.
warning
(
'请等待图片上传完成后再提交'
);
formLoading
.
value
=
false
;
return
;
}
// 构造最终数据
const
data
=
{
...
formData
.
value
,
images
:
imageUrls
,
homeImages
:
homeImageUrls
};
if
(
formType
.
value
===
'assemblyCreate'
)
{
await
IndustryApplicationApi
.
createIndustryApplication
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
...
...
@@ -154,17 +256,84 @@ const submitForm = async () => {
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
information
:
undefined
,
title
:
undefined
,
url
:
undefined
,
description
:
''
,
showStatus
:
undefined
,
remark
:
undefined
,
homeImage
:
undefined
,
homeImage
s
:
[]
,
assemblyType
:
undefined
,
orderNum
:
undefined
}
formRef
.
value
?.
resetFields
()
}
// 预览图片
const
handlePictureCardPreview
=
(
file
)
=>
{
dialogImageUrl
.
value
=
file
.
url
previewVisible
.
value
=
true
// 使用独立的预览状态
}
// 删除图片
const
handleRemove
=
(
file
,
fileList
)
=>
{
// 更新 formData.image 数组
// formData.value.images = fileList.map(item => ({ url: item.url, name: item.name }))
formData
.
value
.
images
=
fileList
}
// 上传成功处理函数
const
handleUploadSuccess
=
(
response
,
file
,
fileList
)
=>
{
// 从响应中提取真实的URL并更新文件对象
if
(
response
&&
response
.
data
)
{
// 根据 useUpload.ts 的实现,可能是 response.data.url 或直接是 response.data
const
realUrl
=
response
.
data
.
url
||
response
.
data
;
if
(
realUrl
)
{
file
.
url
=
realUrl
;
}
}
// 更新 formData.images
formData
.
value
.
images
=
fileList
;
}
// 删除homeImage图片
const
handleRemoveHomeImage
=
(
file
,
fileList
)
=>
{
// 更新 formData.image 数组
// formData.value.images = fileList.map(item => ({ url: item.url, name: item.name }))
formData
.
value
.
homeImages
=
fileList
}
// homeImage上传成功处理函数
const
handleUploadHomeImageSuccess
=
(
response
,
file
,
fileList
)
=>
{
// 从响应中提取真实的URL并更新文件对象
if
(
response
&&
response
.
data
)
{
// 根据 useUpload.ts 的实现,可能是 response.data.url 或直接是 response.data
const
realUrl
=
response
.
data
.
url
||
response
.
data
;
if
(
realUrl
)
{
file
.
url
=
realUrl
;
}
}
// 更新 formData.images
formData
.
value
.
homeImages
=
fileList
;
}
// 上传失败处理函数
const
handleUploadError
=
(
err
,
file
,
fileList
)
=>
{
message
.
error
(
'图片上传失败: '
+
(
err
.
message
||
'未知错误'
))
}
</
script
>
<
style
scoped
>
.upload-tips
{
font-size
:
12px
;
color
:
#999
;
margin-top
:
10px
;
}
.red-text
{
color
:
red
;
}
</
style
>
src/views/biz/industryapplication/index.vue
View file @
2f275d26
...
...
@@ -96,7 +96,7 @@
<el-button
type=
"primary"
plain
@
click=
"openForm('
c
reate')"
@
click=
"openForm('
assemblyC
reate')"
v-hasPermi=
"['biz:industry-application:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
...
...
@@ -135,16 +135,42 @@
>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
label=
"排序值"
align=
"center"
prop=
"orderNum"
/>
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"image"
width=
"100"
>
<!--
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"image"
width=
"100"
>
-->
<!--
<template
#
default=
"scope"
>
-->
<!--
<img
:src=
"scope.row.image"
alt=
"资源展示图"
class=
"h-36px"
/>
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<el-table-column
label=
"展示图地址"
align=
"center"
prop=
"images"
width=
"100"
>
<
template
#
default=
"scope"
>
<img
:src=
"scope.row.image"
alt=
"资源展示图"
class=
"h-36px"
/>
<!-- 只显示第一张图片 -->
<img
v-if=
"scope.row.images && scope.row.images.length > 0"
:src=
"scope.row.images[0]"
alt=
"展示图"
class=
"h-36px"
/>
<span
v-else
>
暂无图片
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"首页展示图片"
align=
"center"
prop=
"homeImage"
width=
"100"
>
<!-- <el-table-column label="首页展示图片" align="center" prop="homeImage" width="100">-->
<!-- <template #default="scope">-->
<!-- <img :src="scope.row.homeImage" alt="首页展示图片" class="h-36px" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column
label=
"首页展示图片"
align=
"center"
prop=
"homeImages"
width=
"100"
>
<
template
#
default=
"scope"
>
<img
:src=
"scope.row.homeImage"
alt=
"首页展示图片"
class=
"h-36px"
/>
<!-- 只显示第一张图片 -->
<img
v-if=
"scope.row.homeImages && scope.row.homeImages.length > 0"
:src=
"scope.row.homeImages[0]"
alt=
"首页展示图片"
class=
"h-36px"
/>
<span
v-else
>
暂无图片
</span>
</
template
>
</el-table-column>
<!-- <el-table-column label="首页展示图片" align="center" prop="homeImage" />-->
<el-table-column
label=
"内容"
align=
"center"
prop=
"information"
/>
<el-table-column
label=
"标题"
align=
"center"
prop=
"title"
/>
...
...
@@ -182,7 +208,7 @@
<el-button
link
type=
"primary"
@
click=
"openForm('
u
pdate', scope.row.id)"
@
click=
"openForm('
assemblyU
pdate', scope.row.id)"
v-hasPermi=
"['biz:industry-application:update']"
>
编辑
...
...
@@ -234,7 +260,7 @@ const queryParams = reactive({
title
:
undefined
,
showStatus
:
undefined
,
createTime
:
[],
homeImage
:
undefined
,
// homeImages: []
,
assemblyType
:
undefined
,
orderNum
:
undefined
})
...
...
src/views/biz/information/InformationForm.vue
View file @
2f275d26
...
...
@@ -49,9 +49,33 @@
</el-radio-group>
</el-form-item>
<el-form-item
label=
"预览图"
prop=
"image"
>
<UploadImg
v-model=
"formData.image"
/>
<!--
<el-form-item
label=
"预览图"
prop=
"image"
>
-->
<!--
<UploadImg
v-model=
"formData.image"
/>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"轮播图地址"
prop=
"images"
>
<el-upload
v-model:file-list=
"formData.images"
:action=
"uploadUrl"
:http-request=
"httpRequest"
list-type=
"picture-card"
:on-preview=
"handlePictureCardPreview"
:on-remove=
"handleRemove"
:on-success=
"handleUploadSuccess"
:on-error=
"handleUploadError"
multiple
>
<i
class=
"el-icon-plus"
></i>
</el-upload>
<!-- 添加预览对话框 -->
<el-dialog
v-model=
"previewVisible"
append-to-body
>
<img
style=
"width: 100%"
:src=
"dialogImageUrl"
alt=
"Preview Image"
/>
</el-dialog>
<!-- 添加提示信息 -->
<p
class=
"upload-tips"
>
请上传 大小不超过
<span
class=
"red-text"
>
5MB
</span>
格式为
<span
class=
"red-text"
>
png/jpg/jpeg
</span>
的文件
</p>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
</el-form-item>
...
...
@@ -65,6 +89,14 @@
<
script
setup
lang=
"ts"
>
import
{
InformationApi
,
Information
}
from
'@/api/biz/information'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
useUpload
}
from
'@/components/UploadFile/src/useUpload'
// 添加预览相关的响应式变量
const
previewVisible
=
ref
(
false
)
// 获取上传相关配置
const
{
uploadUrl
,
httpRequest
}
=
useUpload
()
const
dialogImageUrl
=
ref
(
''
)
/** 活动资讯管理 表单 */
defineOptions
({
name
:
'InformationForm'
})
...
...
@@ -83,7 +115,7 @@ const formData = ref({
title
:
undefined
,
description
:
''
,
showStatus
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
remark
:
undefined
})
const
formRules
=
reactive
({
...
...
@@ -110,7 +142,15 @@ const open = async (type: string, id?: number) => {
if
(
data
.
description
===
null
)
{
data
.
description
=
''
}
formData
.
value
=
data
// 将 images 字段转换为 file-list 需要的格式
if
(
data
.
images
&&
Array
.
isArray
(
data
.
images
))
{
formData
.
value
.
images
=
data
.
images
.
map
(
url
=>
({
url
,
name
:
'image.jpg'
}))
// 添加 name 属性
}
else
{
formData
.
value
.
images
=
[]
}
formData
.
value
=
{
...
data
,
images
:
formData
.
value
.
images
}
// 确保 image 是数组
}
finally
{
formLoading
.
value
=
false
}
...
...
@@ -126,8 +166,27 @@ const submitForm = async () => {
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
formData
.
value
as
unknown
as
Information
if
(
formType
.
value
===
'create'
)
{
// 确保只提取真实的 URL,而不是本地的 Blob URL
const
imageUrls
=
formData
.
value
.
images
.
filter
(
item
=>
item
.
url
&&
!
item
.
url
.
startsWith
(
'blob:'
))
// 过滤掉 Blob URL
.
map
(
item
=>
item
.
url
);
// 如果还有 Blob URL,说明有文件还未上传完成
const
hasBlobUrls
=
formData
.
value
.
images
.
some
(
item
=>
item
.
url
&&
item
.
url
.
startsWith
(
'blob:'
));
if
(
hasBlobUrls
)
{
message
.
warning
(
'请等待图片上传完成后再提交'
);
formLoading
.
value
=
false
;
return
;
}
// 构造最终数据
const
data
=
{
...
formData
.
value
,
images
:
imageUrls
};
if
(
formType
.
value
===
'informationCreate'
)
{
await
InformationApi
.
createInformation
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
...
...
@@ -151,9 +210,54 @@ const resetForm = () => {
title
:
undefined
,
description
:
''
,
showStatus
:
undefined
,
image
:
undefined
,
image
s
:
[]
,
remark
:
undefined
}
formRef
.
value
?.
resetFields
()
}
// 预览图片
const
handlePictureCardPreview
=
(
file
)
=>
{
dialogImageUrl
.
value
=
file
.
url
previewVisible
.
value
=
true
// 使用独立的预览状态
}
// 删除图片
const
handleRemove
=
(
file
,
fileList
)
=>
{
// 更新 formData.image 数组
// formData.value.images = fileList.map(item => ({ url: item.url, name: item.name }))
formData
.
value
.
images
=
fileList
}
// 上传成功处理函数
const
handleUploadSuccess
=
(
response
,
file
,
fileList
)
=>
{
// 从响应中提取真实的URL并更新文件对象
if
(
response
&&
response
.
data
)
{
// 根据 useUpload.ts 的实现,可能是 response.data.url 或直接是 response.data
const
realUrl
=
response
.
data
.
url
||
response
.
data
;
if
(
realUrl
)
{
file
.
url
=
realUrl
;
}
}
// 更新 formData.images
formData
.
value
.
images
=
fileList
;
}
// 上传失败处理函数
const
handleUploadError
=
(
err
,
file
,
fileList
)
=>
{
message
.
error
(
'图片上传失败: '
+
(
err
.
message
||
'未知错误'
))
}
</
script
>
<
style
scoped
>
.upload-tips
{
font-size
:
12px
;
color
:
#999
;
margin-top
:
10px
;
}
.red-text
{
color
:
red
;
}
</
style
>
src/views/biz/information/index.vue
View file @
2f275d26
...
...
@@ -68,7 +68,7 @@
<el-button
type=
"primary"
plain
@
click=
"openForm('
c
reate')"
@
click=
"openForm('
informationC
reate')"
v-hasPermi=
"['biz:information:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
...
...
@@ -130,9 +130,21 @@
</el-table-column>
<!-- <el-table-column label="预览图" align="center" prop="image" />-->
<el-table-column
label=
"预览图"
align=
"center"
prop=
"image"
width=
"100"
>
<!-- <el-table-column label="预览图" align="center" prop="image" width="100">-->
<!-- <template #default="scope">-->
<!-- <img :src="scope.row.image" alt="预览图" class="h-36px" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column
label=
"预览图"
align=
"center"
prop=
"images"
width=
"100"
>
<
template
#
default=
"scope"
>
<img
:src=
"scope.row.image"
alt=
"预览图"
class=
"h-36px"
/>
<!-- 只显示第一张图片 -->
<img
v-if=
"scope.row.images && scope.row.images.length > 0"
:src=
"scope.row.images[0]"
alt=
"预览图"
class=
"h-36px"
/>
<span
v-else
>
暂无图片
</span>
</
template
>
</el-table-column>
...
...
@@ -148,7 +160,7 @@
<el-button
link
type=
"primary"
@
click=
"openForm('
u
pdate', scope.row.id)"
@
click=
"openForm('
informationU
pdate', scope.row.id)"
v-hasPermi=
"['biz:information:update']"
>
编辑
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment