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
48907bde
authored
Dec 07, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【功能新增】IoT:产品详情,优化相关展示
parent
dc2dbcbc
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
40 additions
and
18 deletions
+40
-18
src/api/iot/product/product/index.ts
+6
-0
src/utils/index.ts
+14
-0
src/views/iot/product/product/detail/ProductDetailsHeader.vue
+9
-5
src/views/iot/product/product/detail/ProductDetailsInfo.vue
+7
-3
src/views/iot/product/product/detail/index.vue
+4
-10
No files found.
src/api/iot/product/product/index.ts
View file @
48907bde
...
@@ -7,6 +7,7 @@ export interface ProductVO {
...
@@ -7,6 +7,7 @@ export interface ProductVO {
productKey
:
string
// 产品标识
productKey
:
string
// 产品标识
protocolId
:
number
// 协议编号
protocolId
:
number
// 协议编号
categoryId
:
number
// 产品所属品类标识符
categoryId
:
number
// 产品所属品类标识符
categoryName
?:
string
// 产品所属品类名称
description
:
string
// 产品描述
description
:
string
// 产品描述
validateType
:
number
// 数据校验级别
validateType
:
number
// 数据校验级别
status
:
number
// 产品状态
status
:
number
// 产品状态
...
@@ -29,6 +30,11 @@ export enum DeviceTypeEnum {
...
@@ -29,6 +30,11 @@ export enum DeviceTypeEnum {
GATEWAY_SUB
=
1
,
// 网关子设备
GATEWAY_SUB
=
1
,
// 网关子设备
GATEWAY
=
2
// 网关设备
GATEWAY
=
2
// 网关设备
}
}
// IOT 数据格式枚举类
export
enum
DataFormatEnum
{
JSON
=
0
,
// 标准数据格式(JSON)
CUSTOMIZE
=
1
// 透传/自定义
}
// IoT 产品 API
// IoT 产品 API
export
const
ProductApi
=
{
export
const
ProductApi
=
{
...
...
src/utils/index.ts
View file @
48907bde
...
@@ -117,6 +117,20 @@ export function toAnyString() {
...
@@ -117,6 +117,20 @@ export function toAnyString() {
}
}
/**
/**
* 生成指定长度的随机字符串
*
* @param length 字符串长度
*/
export
function
generateRandomStr
(
length
:
number
):
string
{
const
chars
=
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
let
result
=
''
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
result
+=
chars
.
charAt
(
Math
.
floor
(
Math
.
random
()
*
chars
.
length
))
}
return
result
}
/**
* 首字母大写
* 首字母大写
*/
*/
export
function
firstUpperCase
(
str
:
string
)
{
export
function
firstUpperCase
(
str
:
string
)
{
...
...
src/views/iot/product/product/detail/ProductDetailsHeader.vue
View file @
48907bde
...
@@ -45,8 +45,8 @@
...
@@ -45,8 +45,8 @@
</el-descriptions>
</el-descriptions>
<el-descriptions
:column=
"5"
direction=
"horizontal"
>
<el-descriptions
:column=
"5"
direction=
"horizontal"
>
<el-descriptions-item
label=
"设备数"
>
<el-descriptions-item
label=
"设备数"
>
{{
product
.
deviceCount
}}
{{
product
.
deviceCount
??
'加载中...'
}}
<el-button
@
click=
"goTo
Managemen
t(product.id)"
>
前往管理
</el-button>
<el-button
@
click=
"goTo
DeviceLis
t(product.id)"
>
前往管理
</el-button>
</el-descriptions-item>
</el-descriptions-item>
</el-descriptions>
</el-descriptions>
</ContentWrap>
</ContentWrap>
...
@@ -73,16 +73,18 @@ const copyToClipboard = async (text: string) => {
...
@@ -73,16 +73,18 @@ const copyToClipboard = async (text: string) => {
/** 路由跳转到设备管理 */
/** 路由跳转到设备管理 */
const
{
push
}
=
useRouter
()
const
{
push
}
=
useRouter
()
const
goTo
Management
=
(
productId
:
string
)
=>
{
const
goTo
DeviceList
=
(
productId
:
number
)
=>
{
push
({
name
:
'IoTDevice'
,
query
:
{
productId
}
})
push
({
name
:
'IoTDevice'
,
params
:
{
productId
}
})
}
}
/**
操作修改
*/
/**
修改操作
*/
const
emit
=
defineEmits
([
'refresh'
])
// 定义 Emits
const
emit
=
defineEmits
([
'refresh'
])
// 定义 Emits
const
formRef
=
ref
()
const
formRef
=
ref
()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
formRef
.
value
.
open
(
type
,
id
)
formRef
.
value
.
open
(
type
,
id
)
}
}
/** 发布操作 */
const
confirmPublish
=
async
(
id
:
number
)
=>
{
const
confirmPublish
=
async
(
id
:
number
)
=>
{
try
{
try
{
await
ProductApi
.
updateProductStatus
(
id
,
1
)
await
ProductApi
.
updateProductStatus
(
id
,
1
)
...
@@ -93,6 +95,8 @@ const confirmPublish = async (id: number) => {
...
@@ -93,6 +95,8 @@ const confirmPublish = async (id: number) => {
message
.
error
(
'发布失败'
)
message
.
error
(
'发布失败'
)
}
}
}
}
/** 撤销发布操作 */
const
confirmUnpublish
=
async
(
id
:
number
)
=>
{
const
confirmUnpublish
=
async
(
id
:
number
)
=>
{
try
{
try
{
await
ProductApi
.
updateProductStatus
(
id
,
0
)
await
ProductApi
.
updateProductStatus
(
id
,
0
)
...
...
src/views/iot/product/product/detail/ProductDetailsInfo.vue
View file @
48907bde
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
<el-collapse
v-model=
"activeNames"
>
<el-collapse
v-model=
"activeNames"
>
<el-descriptions
:column=
"3"
title=
"产品信息"
>
<el-descriptions
:column=
"3"
title=
"产品信息"
>
<el-descriptions-item
label=
"产品名称"
>
{{
product
.
name
}}
</el-descriptions-item>
<el-descriptions-item
label=
"产品名称"
>
{{
product
.
name
}}
</el-descriptions-item>
<el-descriptions-item
label=
"所属分类"
>
{{
product
.
categoryName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"设备类型"
>
<el-descriptions-item
label=
"设备类型"
>
<dict-tag
:type=
"DICT_TYPE.IOT_PRODUCT_DEVICE_TYPE"
:value=
"product.deviceType"
/>
<dict-tag
:type=
"DICT_TYPE.IOT_PRODUCT_DEVICE_TYPE"
:value=
"product.deviceType"
/>
</el-descriptions-item>
</el-descriptions-item>
...
@@ -20,11 +21,14 @@
...
@@ -20,11 +21,14 @@
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item
<el-descriptions-item
label=
"联网方式"
label=
"联网方式"
v-if=
"
product.deviceType === 0 || product.deviceType === 2
"
v-if=
"
[DeviceTypeEnum.DEVICE, DeviceTypeEnum.GATEWAY].includes(product.deviceType)
"
>
>
<dict-tag
:type=
"DICT_TYPE.IOT_NET_TYPE"
:value=
"product.netType"
/>
<dict-tag
:type=
"DICT_TYPE.IOT_NET_TYPE"
:value=
"product.netType"
/>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item
label=
"接入网关协议"
v-if=
"product.deviceType === 1"
>
<el-descriptions-item
label=
"接入网关协议"
v-if=
"product.deviceType === DeviceTypeEnum.GATEWAY_SUB"
>
<dict-tag
:type=
"DICT_TYPE.IOT_PROTOCOL_TYPE"
:value=
"product.protocolType"
/>
<dict-tag
:type=
"DICT_TYPE.IOT_PROTOCOL_TYPE"
:value=
"product.protocolType"
/>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item
label=
"产品描述"
>
{{
product
.
description
}}
</el-descriptions-item>
<el-descriptions-item
label=
"产品描述"
>
{{
product
.
description
}}
</el-descriptions-item>
...
@@ -34,7 +38,7 @@
...
@@ -34,7 +38,7 @@
</
template
>
</
template
>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
ProductVO
}
from
'@/api/iot/product/product'
import
{
DeviceTypeEnum
,
ProductVO
}
from
'@/api/iot/product/product'
import
{
formatDate
}
from
'@/utils/formatTime'
import
{
formatDate
}
from
'@/utils/formatTime'
const
{
product
}
=
defineProps
<
{
product
:
ProductVO
}
>
()
const
{
product
}
=
defineProps
<
{
product
:
ProductVO
}
>
()
...
...
src/views/iot/product/product/detail/index.vue
View file @
48907bde
...
@@ -33,7 +33,7 @@ const { currentRoute } = useRouter()
...
@@ -33,7 +33,7 @@ const { currentRoute } = useRouter()
const
route
=
useRoute
()
const
route
=
useRoute
()
const
message
=
useMessage
()
const
message
=
useMessage
()
const
id
=
route
.
params
.
id
// 编号
const
id
=
Number
(
route
.
params
.
id
)
// 编号
const
loading
=
ref
(
true
)
// 加载中
const
loading
=
ref
(
true
)
// 加载中
const
product
=
ref
<
ProductVO
>
({}
as
ProductVO
)
// 详情
const
product
=
ref
<
ProductVO
>
({}
as
ProductVO
)
// 详情
const
activeTab
=
ref
(
'info'
)
// 默认激活的标签页
const
activeTab
=
ref
(
'info'
)
// 默认激活的标签页
...
@@ -43,20 +43,17 @@ const getProductData = async (id: number) => {
...
@@ -43,20 +43,17 @@ const getProductData = async (id: number) => {
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
product
.
value
=
await
ProductApi
.
getProduct
(
id
)
product
.
value
=
await
ProductApi
.
getProduct
(
id
)
console
.
log
(
'Product data:'
,
product
.
value
)
}
finally
{
}
finally
{
loading
.
value
=
false
loading
.
value
=
false
}
}
}
}
/
/ 查询设备数量
/
** 查询设备数量 */
const
getDeviceCount
=
async
(
productId
:
number
)
=>
{
const
getDeviceCount
=
async
(
productId
:
number
)
=>
{
try
{
try
{
const
count
=
await
DeviceApi
.
getDeviceCount
(
productId
)
return
await
DeviceApi
.
getDeviceCount
(
productId
)
console
.
log
(
'Device count response:'
,
count
)
return
count
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
'Error fetching device count:'
,
error
)
console
.
error
(
'Error fetching device count:'
,
error
,
'productId:'
,
productId
)
return
0
return
0
}
}
}
}
...
@@ -72,9 +69,6 @@ onMounted(async () => {
...
@@ -72,9 +69,6 @@ onMounted(async () => {
// 查询设备数量
// 查询设备数量
if
(
product
.
value
.
id
)
{
if
(
product
.
value
.
id
)
{
product
.
value
.
deviceCount
=
await
getDeviceCount
(
product
.
value
.
id
)
product
.
value
.
deviceCount
=
await
getDeviceCount
(
product
.
value
.
id
)
console
.
log
(
'Device count:'
,
product
.
value
.
deviceCount
)
}
else
{
console
.
error
(
'Product ID is undefined'
)
}
}
})
})
</
script
>
</
script
>
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