Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
V
vue_django_test
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
周田
vue_django_test
Commits
1afd0664
Commit
1afd0664
authored
Aug 17, 2023
by
qianmo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update: 修改字段
parent
e853217f
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
483 additions
and
138 deletions
+483
-138
consumers.py
chat/consumers.py
+3
-3
collapse-table.vue
frontend/src/components/collapse-table.vue
+15
-10
device-table.vue
frontend/src/components/device-table.vue
+96
-0
kit-collapse.vue
frontend/src/components/kit-collapse.vue
+24
-16
kit-device.vue
frontend/src/components/kit-device.vue
+93
-26
protpcol-table.vue
frontend/src/components/protpcol-table.vue
+102
-65
device.js
frontend/src/dao/device.js
+25
-1
home-page.vue
frontend/src/views/index/home-page.vue
+96
-6
protocol.vue
frontend/src/views/protocol/protocol.vue
+1
-2
mqtt.py
mqtt/mqtt.py
+7
-5
settings.py
vue_django/settings.py
+19
-2
urls.py
vue_django/urls.py
+2
-2
xdc.sqlite
xdc.sqlite
+0
-0
No files found.
chat/consumers.py
View file @
1afd0664
...
@@ -73,9 +73,9 @@ class ChatConsumer(AsyncWebsocketConsumer):
...
@@ -73,9 +73,9 @@ class ChatConsumer(AsyncWebsocketConsumer):
# Receive message from room group
# Receive message from room group
async
def
chat_message
(
self
,
event
):
async
def
chat_message
(
self
,
event
):
message
=
event
[
"message"
]
message
=
event
[
"message"
]
# Send message to WebSocket
# Send message to WebSocket
# await self.send(text_data=json.dumps({"message": message}))
print
(
message
)
await
self
.
send
(
bytes_data
=
message
)
await
self
.
send
(
text_data
=
json
.
dumps
({
"message"
:
message
}))
# await self.send(bytes_data=message)
frontend/src/components/collapse-table.vue
View file @
1afd0664
...
@@ -13,14 +13,11 @@
...
@@ -13,14 +13,11 @@
</div>
</div>
</div>
</div>
<div
class=
"mb-4 mt-4"
>
协议
指令
</div>
<div
class=
"mb-4 mt-4"
>
协议
规范
</div>
<el-collapse
class=
"mt-4"
>
<el-collapse
class=
"mt-4"
>
<el-collapse-item
title=
"HY_ACU7M5_PositionSet XY置位指令 Tx"
name=
"1"
>
<el-collapse-item
v-for=
"cmd in parentMsg"
:title=
"cmd.cmd_name+' '+cmd.cmd_explain+' '+cmd.cmd_type"
>
<protpcol-table></protpcol-table>
<protpcol-table
v-if=
"protocolCmd"
:info=
"cmd.cmd_name"
:message=
"protocolCmd"
></protpcol-table>
</el-collapse-item>
<el-collapse-item
title=
"HY_ACU7M5_MoveStop 停止运动指令 Tx"
name=
"2"
>
<protpcol-table></protpcol-table>
</el-collapse-item>
</el-collapse-item>
</el-collapse>
</el-collapse>
...
@@ -64,13 +61,24 @@
...
@@ -64,13 +61,24 @@
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
}
from
'vue'
import
{
ref
,
toRefs
}
from
'vue'
import
{
ElMessage
,
ElMessageBox
}
from
"element-plus"
;
import
{
ElMessage
,
ElMessageBox
}
from
"element-plus"
;
import
ProtpcolTable
from
"./protpcol-table.vue"
;
import
ProtpcolTable
from
"./protpcol-table.vue"
;
const
addCmd
=
ref
(
false
)
const
addCmd
=
ref
(
false
)
const
option
=
ref
(
'option'
)
const
option
=
ref
(
'option'
)
const
formLabelWidth
=
'140px'
const
formLabelWidth
=
'140px'
const
props
=
defineProps
({
name
:
String
,
info
:
Object
,
protocolcmd
:
Object
})
const
item
=
ref
()
item
.
value
=
toRefs
(
props
).
name
.
value
const
parentMsg
=
ref
()
parentMsg
.
value
=
toRefs
(
props
).
info
.
value
[
item
.
value
]
const
protocolCmd
=
ref
()
protocolCmd
.
value
=
toRefs
(
props
).
protocolcmd
.
value
const
open
=
()
=>
{
const
open
=
()
=>
{
ElMessageBox
.
confirm
(
ElMessageBox
.
confirm
(
...
@@ -100,9 +108,6 @@ const open = () => {
...
@@ -100,9 +108,6 @@ const open = () => {
<
style
>
<
style
>
.container
{
.container
{
/*width: 100%;*/
/*border: 1px solid;*/
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
/* 使内部元素平均分布 */
justify-content
:
space-between
;
/* 使内部元素平均分布 */
align-items
:
center
;
/* 垂直居中 */
align-items
:
center
;
/* 垂直居中 */
...
...
frontend/src/components/device-table.vue
0 → 100644
View file @
1afd0664
<
template
>
<div
style=
"width: 95%;margin: auto"
>
<div
class=
"flex mt-4 items-center"
>
<div>
设备名称
</div>
<div
class=
"ml-4"
>
tcp server
</div>
<div
class=
"ml-4"
>
ip
</div>
<div
class=
"ml-4"
>
port
</div>
<el-switch
v-model=
"value"
:disabled=
"isSwitchDisabled"
class=
"ml-4"
></el-switch>
<el-button
class=
"ml-4"
@
click=
"dialogFormVisible = true"
>
设置
</el-button>
</div>
<el-table
style=
"width: 100%"
:data=
"tableData"
:show-header=
"false"
border
class=
"mt-2"
>
<el-table-column
v-for=
"(item, index) in tableHeader"
:key=
"index"
:prop=
"item"
:fixed=
"isTitleColumn ? 'left' : ''"
>
</el-table-column>
</el-table>
</div>
<el-dialog
v-model=
"dialogFormVisible"
>
<el-form
:model=
"form"
>
<el-form-item
label=
"模式"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"form.mode"
>
<el-option
label=
"tcp server"
value=
"tcp server"
/>
<el-option
label=
"tcp client"
value=
"tcp client"
/>
<el-option
label=
"tcp/ip"
value=
"tcp/ip"
/>
<el-option
label=
"udp"
value=
"udp"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"ip"
:label-width=
"formLabelWidth"
>
<el-input
v-model=
"form.ip"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
label=
"端口"
:label-width=
"formLabelWidth"
>
<el-input
v-model=
"form.port"
autocomplete=
"off"
/>
</el-form-item>
</el-form>
<template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"dialogFormVisible = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"dialogFormVisible = false"
>
确定
</el-button>
</span>
</
template
>
</el-dialog>
</template>
<
script
setup
>
import
{
ref
,
toRefs
,
watch
}
from
'vue'
const
value
=
ref
(
true
)
const
dialogFormVisible
=
ref
(
false
)
const
formLabelWidth
=
'140px'
const
tableHeader
=
ref
([])
const
tableData
=
ref
([])
tableData
.
value
=
[
{
title
:
'变量'
,
value0
:
'模式'
,
value1
:
'ip'
,
value2
:
'端口'
},
{
title
:
'值'
,
value0
:
'tcp server'
,
value1
:
'localhost'
,
value2
:
'8000'
}
]
for
(
const
key
in
tableData
.
value
[
0
]){
tableHeader
.
value
.
push
(
key
)
}
const
form
=
ref
(
{
mode
:
''
,
ip
:
''
,
port
:
''
}
)
const
props
=
defineProps
({
tag
:
String
})
const
isSwitchDisabled
=
ref
(
true
)
console
.
log
(
"3"
,
toRefs
(
props
).
tag
.
value
)
watch
(
()
=>
toRefs
(
props
).
tag
.
value
,
(
newValue
)
=>
{
if
(
newValue
===
'real'
){
value
.
value
=
true
isSwitchDisabled
.
value
=
true
}
else
if
(
newValue
===
'virtual'
){
isSwitchDisabled
.
value
=
false
}
})
const
isTitleColumn
=
(
column
)
=>
column
.
property
===
'title'
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
frontend/src/components/kit-collapse.vue
View file @
1afd0664
<
template
>
<
template
>
<div
class=
"demo-collapse"
>
<div
class=
"demo-collapse"
>
<el-collapse>
<el-collapse>
<el-collapse-item
title=
"HY_ACU7M5_Antenna_PROTOCOL"
name=
"1"
>
<el-collapse-item
v-for=
"item in protocols"
>
<template
#
title
>
{{
item
}}
</
template
>
<div
style=
"margin: auto; width: 90%"
>
<div
style=
"margin: auto; width: 90%"
>
<collapse-table
class=
"mt-4"
></collapse-table>
<collapse-table
</div>
v-if=
"protocolcmd"
</el-collapse-item>
class=
"mt-4"
<el-collapse-item
title=
" HY_HWF0355-0357FC_PROTOCOL"
name=
"2"
>
:info=
"parentMsg"
<div
style=
"margin: auto; width: 90%"
>
:name=
"item"
<collapse-table
class=
"mt-4"
></collapse-table>
:protocolcmd=
"protocolcmd"
</div>
>
</el-collapse-item>
</collapse-table>
<el-collapse-item
title=
"HY_DualChannelLBandOpticalTransceiver_PROTOCOL"
name=
"3"
>
<div
style=
"margin: auto; width: 90%"
>
<collapse-table
class=
"mt-4"
></collapse-table>
</div>
</div>
</el-collapse-item>
</el-collapse-item>
</el-collapse>
</el-collapse>
...
@@ -23,15 +21,25 @@
...
@@ -23,15 +21,25 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
'vue'
import
{
ref
,
onMounted
}
from
'vue'
import
CollapseTable
from
"./collapse-table.vue"
;
import
CollapseTable
from
"./collapse-table.vue"
;
import
{
DeviceProtocol
}
from
"../dao/device"
;
import
{
DeviceProtocol
,
ProtocolCmd
}
from
"../dao/device"
;
const
protocols
=
ref
()
const
parentMsg
=
ref
()
const
protocolcmd
=
ref
()
async
function
getDeviceProtocol
(){
async
function
getDeviceProtocol
(){
let
data
=
await
DeviceProtocol
()
let
data
=
await
DeviceProtocol
()
console
.
log
(
data
)
protocols
.
value
=
data
.
fields
parentMsg
.
value
=
data
}
}
onMounted
(()
=>
{
async
function
getProtocolCmd
(){
getDeviceProtocol
()
let
cmds
=
await
ProtocolCmd
()
protocolcmd
.
value
=
cmds
}
onMounted
(
async
()
=>
{
await
getDeviceProtocol
()
await
getProtocolCmd
()
})
})
</
script
>
</
script
>
...
...
frontend/src/components/kit-device.vue
View file @
1afd0664
<
template
>
<
template
>
<div
class=
"mt-10"
v-for=
"item in deviceData"
>
<DeviceTable
v-if=
"tag"
:tag=
"tag"
></DeviceTable>
<span>
{{
item
.
name
}}
</span>
<div
style=
"display: flex; justify-content: center;"
>
<div
id=
"flex-container"
class=
"mt-4"
>
<el-button
<div
class=
"flex-item"
>
端口号:
</div>
class=
"mt-2"
style=
"width: 95%;border: 1px dashed"
<div
class=
"flex-item"
>
@
click=
"open"
<el-input
v-model=
"item.portNumber"
></el-input>
>
+
</el-button>
</div>
<div
class=
"flex-item"
>
开关:
</div>
<div
class=
"flex-item"
>
<el-switch
v-model=
"item.switchValue"
></el-switch>
</div>
</div>
</div>
</div>
<el-dialog
v-model=
"deviceVisible"
>
<el-form
:model=
"device"
>
<el-form-item
label=
"模式"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"device.mode"
>
<el-option
label=
"tcp server"
value=
"tcp server"
/>
<el-option
label=
"tcp client"
value=
"tcp client"
/>
<el-option
label=
"tcp/ip"
value=
"tcp/ip"
/>
<el-option
label=
"udp"
value=
"udp"
/>
</el-select>
</el-form-item>
</el-form>
<template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"deviceVisible = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"deviceVisible = false"
>
确定
</el-button>
</span>
</
template
>
</el-dialog>
<el-dialog
v-model=
"virtualDeviceVisible"
>
<el-form
:model=
"virtualDevice"
>
<el-form-item
label=
"协议"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"virtualDevice.protocol"
>
<el-option
label=
"option 1"
value=
"option 1"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"协议版本"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"virtualDevice.version"
>
<el-option
label=
"option 1"
value=
"option 1"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"模式"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"virtualDevice.mode"
>
<el-option
label=
"tcp server"
value=
"tcp server"
/>
<el-option
label=
"tcp client"
value=
"tcp client"
/>
<el-option
label=
"tcp/ip"
value=
"tcp/ip"
/>
<el-option
label=
"udp"
value=
"udp"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"本机ip"
:label-width=
"formLabelWidth"
>
<el-input
v-model=
"virtualDevice.ip"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
label=
"端口"
:label-width=
"formLabelWidth"
>
<el-input
v-model=
"virtualDevice.port"
autocomplete=
"off"
/>
</el-form-item>
</el-form>
<
template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"virtualDeviceVisible = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"virtualDeviceVisible = false"
>
确定
</el-button>
</span>
</
template
>
</el-dialog>
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
}
from
'vue'
import
{
onMounted
,
ref
,
toRefs
,
watch
}
from
'vue'
import
DeviceTable
from
"./device-table.vue"
;
const
deviceData
=
ref
([
const
deviceVisible
=
ref
(
false
)
{
name
:
'7M5ACU'
,
portNumber
:
'1111'
,
switchValue
:
true
},
const
virtualDeviceVisible
=
ref
(
false
)
{
name
:
'变频器'
,
portNumber
:
'0000'
,
switchValue
:
false
}
const
formLabelWidth
=
'140px'
])
const
device
=
ref
({
mode
:
''
})
</
script
>
const
virtualDevice
=
ref
(
{
protocol
:
''
,
version
:
''
,
mode
:
''
,
ip
:
''
,
port
:
''
}
)
const
props
=
defineProps
({
tag
:
String
})
const
tag
=
ref
(
toRefs
(
props
).
tag
.
value
)
<
style
>
const
open
=
()
=>
{
#flex-container
{
if
(
toRefs
(
props
).
tag
.
value
===
'real'
){
display
:
flex
;
deviceVisible
.
value
=
true
align-items
:
center
;
}
else
{
virtualDeviceVisible
.
value
=
true
}
}
}
.flex-item
{
watch
(
()
=>
toRefs
(
props
).
tag
.
value
,
(
newValue
)
=>
{
margin-right
:
20px
;
tag
.
value
=
newValue
}
})
</
style
>
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
frontend/src/components/protpcol-table.vue
View file @
1afd0664
<
template
>
<
template
>
<el-table
:data=
"tableData"
style=
"width: 100%"
>
<el-table
<el-table-column
fixed
prop=
"FieldName"
label=
"字段名"
style=
"width: 25%"
/>
:data=
"tableData"
<el-table-column
prop=
"FieldLength"
label=
"字段长度"
style=
"width: 25%"
/>
style=
"width: 100%"
<el-table-column
prop=
"Value"
label=
"默认值"
style=
"width: 25%"
/>
>
<el-table-column
fixed
prop=
"fieldname"
label=
"字段名"
style=
"width: 25%"
/>
<el-table-column
prop=
"fieldsize"
label=
"字段长度"
style=
"width: 25%"
/>
<el-table-column
prop=
"value"
label=
"默认值"
style=
"width: 25%"
/>
<el-table-column
fixed=
"right"
style=
"width: 25%"
>
<el-table-column
fixed=
"right"
style=
"width: 25%"
>
<template
#
default=
"
{row}">
<template
#
default=
"
{row}">
<div
style=
"display: flex; justify-content: space-between;"
>
<div
style=
"display: flex; justify-content: space-between;"
>
...
@@ -25,31 +28,31 @@
...
@@ -25,31 +28,31 @@
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"命令名"
>
<el-form-item
label=
"命令名"
>
<el-input
v-model=
"fields.cmd
Name
"
></el-input>
<el-input
v-model=
"fields.cmd
_name"
:disabled=
"!flag
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"指令类型"
>
<el-form-item
label=
"指令类型"
>
<el-input
v-model=
"fields.cmd
Type
"
></el-input>
<el-input
v-model=
"fields.cmd
_type"
:disabled=
"!flag
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"序号"
>
<el-form-item
label=
"序号"
>
<el-input
v-model=
"fields.
index
"
></el-input>
<el-input
v-model=
"fields.
fieldindex"
:disabled=
"!flag
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"名称"
>
<el-form-item
label=
"名称"
>
<el-input
v-model=
"fields.name"
></el-input>
<el-input
v-model=
"fields.
field
name"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"长度"
>
<el-form-item
label=
"长度"
>
<el-input
v-model=
"fields.
length
"
></el-input>
<el-input
v-model=
"fields.
fieldsize
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
...
@@ -61,19 +64,19 @@
...
@@ -61,19 +64,19 @@
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"指令最大值"
>
<el-form-item
label=
"指令最大值"
>
<el-input
v-model=
"fields.
cmdMax
"
></el-input>
<el-input
v-model=
"fields.
maxvalue
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"指令最小值"
>
<el-form-item
label=
"指令最小值"
>
<el-input
v-model=
"fields.
cmdMin
"
></el-input>
<el-input
v-model=
"fields.
minvalue
"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"字段类型"
>
<el-form-item
label=
"字段类型"
>
<el-select
v-model=
"fields.
fieldT
ype"
>
<el-select
v-model=
"fields.
datat
ype"
>
<el-option
v-for=
"item in fieldTypes"
:label=
"item.label"
:value=
"item.value"
:key=
"item.value"
></el-option>
<el-option
v-for=
"item in fieldTypes"
:label=
"item.label"
:value=
"item.value"
:key=
"item.value"
></el-option>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
...
@@ -81,56 +84,64 @@
...
@@ -81,56 +84,64 @@
</el-row>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"
输入数据
操作"
>
<el-form-item
label=
"
Lua对输入数据的
操作"
>
<el-input></el-input>
<el-input
v-model=
"fields.lua_script_in"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"
输入数据操作参数
"
>
<el-form-item
label=
"
Lua对输出数据的操作
"
>
<el-input></el-input>
<el-input
v-model=
"fields.lua_script_out"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
:offset=
"12"
>
<el-form-item
>
<el-button
class=
"mr-0"
@
click=
"more = !more"
>
更多操作
</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row
v-if=
"more"
>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"输
出
数据操作"
>
<el-form-item
label=
"输
入
数据操作"
>
<el-input></el-input>
<el-input
v-model=
"fields.operation_in"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"输
出
数据操作参数"
>
<el-form-item
label=
"输
入
数据操作参数"
>
<el-input></el-input>
<el-input
v-model=
"fields.operation_in_num"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row
v-if=
"more"
>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"输
入数据字节
操作"
>
<el-form-item
label=
"输
出数据
操作"
>
<el-input></el-input>
<el-input
v-model=
"fields.operation_out"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"输出数据
字节操作
"
>
<el-form-item
label=
"输出数据
操作参数
"
>
<el-input></el-input>
<el-input
v-model=
"fields.operation_out_num"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row
v-if=
"more"
>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"
Lua对输入数据的
操作"
>
<el-form-item
label=
"
输入数据字节
操作"
>
<el-input></el-input>
<el-input
v-model=
"fields.operabo_in"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"
Lua对输出数据的
操作"
>
<el-form-item
label=
"
输出数据字节
操作"
>
<el-input></el-input>
<el-input
v-model=
"fields.operabo_out"
></el-input>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
</el-form>
</el-form>
<
template
#
footer
>
<
template
#
footer
>
<span
class=
"dialog-footer"
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"dialogVisible = false"
>
取消
</el-button>
<el-button
@
click=
"dialogVisible = false
; more = false
"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"open"
>
<el-button
type=
"primary"
@
click=
"open"
>
确定
确定
</el-button>
</el-button>
...
@@ -140,41 +151,45 @@
...
@@ -140,41 +151,45 @@
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
}
from
'vue'
import
{
ref
,
toRefs
}
from
'vue'
import
{
ElMessage
,
ElMessageBox
}
from
"element-plus"
;
import
{
ElMessage
,
ElMessageBox
}
from
"element-plus"
;
import
{
DeleteProtocolCmd
,
EditProtocolCmd
}
from
"../dao/device"
;
const
flag
=
ref
(
false
)
const
flag
=
ref
(
false
)
const
dialogVisible
=
ref
(
false
)
const
dialogVisible
=
ref
(
false
)
const
tableData
=
[
const
more
=
ref
(
false
)
{
FieldName
:
'Cmds'
,
const
props
=
defineProps
({
FieldLength
:
3
,
//子组件接收父组件传递过来的值
Value
:
'$XY'
,
info
:
String
,
},
message
:
Object
{
})
FieldName
:
'Comma'
,
const
cmdName
=
ref
(
toRefs
(
props
).
info
.
value
)
FieldLength
:
1
,
const
cmdFields
=
ref
(
toRefs
(
props
).
message
.
value
[
cmdName
.
value
])
Value
:
','
,
const
tableData
=
ref
([])
},
]
for
(
const
item
of
cmdFields
.
value
){
tableData
.
value
.
push
(
item
)
}
const
fields
=
ref
({
const
fields
=
ref
({
cmd
N
ame
:
''
,
cmd
_n
ame
:
''
,
cmd
T
ype
:
''
,
cmd
_t
ype
:
''
,
index
:
''
,
field
index
:
''
,
name
:
''
,
field
name
:
''
,
length
:
''
,
fieldsize
:
''
,
value
:
''
,
value
:
''
,
cmdMax
:
''
,
minvalue
:
''
,
cmdMin
:
''
,
maxvalue
:
''
,
fieldT
ype
:
''
,
datat
ype
:
''
,
inputDataActio
n
:
''
,
operation_i
n
:
''
,
inputDataActionPara
m
:
''
,
operation_in_nu
m
:
''
,
o
utputDataAction
:
''
,
o
peration_out
:
''
,
o
utputDataActionPara
m
:
''
,
o
peration_out_nu
m
:
''
,
inputDataByteActio
n
:
''
,
operabo_i
n
:
''
,
o
utputDataByteAction
:
''
,
o
perabo_out
:
''
,
LuaInput
:
''
,
lua_script_in
:
''
,
LuaOutp
ut
:
''
lua_script_o
ut
:
''
})
})
const
fieldTypes
=
[
const
fieldTypes
=
[
{
value
:
0
,
label
:
'DATATYPE_DEFAULT'
},
{
value
:
0
,
label
:
'DATATYPE_DEFAULT'
},
...
@@ -195,6 +210,7 @@ const fieldTypes = [
...
@@ -195,6 +210,7 @@ const fieldTypes = [
{
value
:
15
,
label
:
'DATATYPE_TIMESTR '
},
{
value
:
15
,
label
:
'DATATYPE_TIMESTR '
},
{
value
:
16
,
label
:
'DATATYPE_MAX'
},
{
value
:
16
,
label
:
'DATATYPE_MAX'
},
]
]
let
operation
=
''
let
operation
=
''
const
addField
=
()
=>
{
const
addField
=
()
=>
{
...
@@ -208,14 +224,21 @@ const addField = () => {
...
@@ -208,14 +224,21 @@ const addField = () => {
function
editField
(
data
){
function
editField
(
data
){
dialogVisible
.
value
=
true
dialogVisible
.
value
=
true
flag
.
value
=
false
flag
.
value
=
false
fields
.
value
[
'cmdName'
]
=
data
.
FieldName
for
(
const
key
in
data
){
fields
.
value
[
'length'
]
=
data
.
FieldLength
fields
.
value
[
key
]
=
data
[
key
]
fields
.
value
[
'value'
]
=
data
.
Value
}
}
}
function
open
(
data
){
async
function
Edit
(
id
,
params
){
console
.
log
(
data
)
await
EditProtocolCmd
(
id
,
params
)
}
async
function
Delete
(
id
){
await
DeleteProtocolCmd
(
id
)
}
function
open
(
data
){
if
(
data
===
'delete'
){
if
(
data
===
'delete'
){
operation
=
'删除'
operation
=
'删除'
}
else
if
(
flag
.
value
){
}
else
if
(
flag
.
value
){
...
@@ -238,6 +261,19 @@ function open(data){
...
@@ -238,6 +261,19 @@ function open(data){
message
:
operation
+
'成功'
,
message
:
operation
+
'成功'
,
})
})
dialogVisible
.
value
=
false
dialogVisible
.
value
=
false
more
.
value
=
false
if
(
operation
===
'修改'
){
let
params
=
fields
.
value
for
(
const
key
in
params
){
if
(
params
[
key
]
===
null
){
params
[
key
]
=
'none'
}
}
Edit
(
params
[
'id'
],
params
)
window
.
location
.
reload
()
}
else
if
(
operation
===
'删除'
){
// todo: 删除操作
}
})
})
.
catch
(()
=>
{
.
catch
(()
=>
{
ElMessage
({
ElMessage
({
...
@@ -246,6 +282,7 @@ function open(data){
...
@@ -246,6 +282,7 @@ function open(data){
})
})
})
})
}
}
</
script
>
</
script
>
<
style
>
<
style
>
...
...
frontend/src/dao/device.js
View file @
1afd0664
import
axios
from
"axios"
import
axios
from
"axios"
export
function
DeviceProtocol
(){
export
function
DeviceProtocol
(){
axios
.
get
(
'http://192.168.0.216:8000/op/dev_cmd_name_poll'
).
then
(
return
axios
.
get
(
'http://192.168.0.214:8000/op/dev_cmd_name_poll'
).
then
(
function
(
response
){
return
response
.
data
}
)
}
export
function
ProtocolCmd
(){
return
axios
.
get
(
'http://192.168.0.214:8000/op/all_dev_cmd_define'
).
then
(
function
(
response
){
return
response
.
data
}
)
}
export
function
EditProtocolCmd
(
id
,
params
){
return
axios
.
put
(
'http://192.168.0.214:8000/op/all_dev_cmd_define/'
+
id
+
'/'
,
params
).
then
(
function
(
response
){
return
response
.
data
}
)
}
export
function
DeleteProtocolCmd
(
id
){
return
axios
.
delete
(
'http://192.168.0.214:8000/op/all_dev_cmd_define'
,
id
).
then
(
function
(
response
){
function
(
response
){
return
response
.
data
return
response
.
data
}
}
...
...
frontend/src/views/index/home-page.vue
View file @
1afd0664
...
@@ -12,13 +12,27 @@
...
@@ -12,13 +12,27 @@
</div>
</div>
<div
class=
"flex mt-4"
>
<div
class=
"flex mt-4"
>
<el-input></el-input>
<el-input></el-input>
<el-button
class=
"ml-4"
>
设置指令
</el-button>
<el-button
class=
"ml-4"
@
click=
"setting"
>
设置指令
</el-button>
<el-button>
发送指令
</el-button>
<el-button>
发送指令
</el-button>
</div>
</div>
</div>
</div>
<div
style=
"width: 58%; height: 100%; border: 1px solid"
class=
"ml-4"
>
<div
style=
"width: 58%; height: 100%; border: 1px solid;overflow: auto;"
class=
"ml-4"
>
<div
style=
"border-bottom: 1px solid"
>
<el-button-group>
<el-button
class=
"square-button"
:type=
"type1 ? 'primary' : 'Default'"
@
click=
"showComponent('real')"
>
设备
</el-button>
<el-button
class=
"square-button"
:type=
"type2 ? 'primary' : 'Default'"
@
click=
"showComponent('virtual')"
>
模拟设备
</el-button>
</el-button-group>
</div>
<KitDevice
v-if=
"tag"
:tag =
"tag"
></KitDevice>
</div>
</div>
</div>
</div>
...
@@ -32,14 +46,49 @@
...
@@ -32,14 +46,49 @@
<el-button
class=
"ml-4"
size=
"large"
>
导出
</el-button>
<el-button
class=
"ml-4"
size=
"large"
>
导出
</el-button>
</div>
</div>
<el-dialog
v-model=
"cmdVisible"
>
<el-form>
<el-form-item
label=
"设备"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"cmds.device"
@
change=
"checkToShowInput"
>
<el-option
label=
"option 1"
value=
"option 1"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"指令名"
:label-width=
"formLabelWidth"
>
<el-select
v-model=
"cmds.cmd_name"
@
change=
"checkToShowInput"
>
<el-option
label=
"option 1"
value=
"option 1"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"某个字段"
:label-width=
"formLabelWidth"
v-if=
"show"
>
<el-input
autocomplete=
"off"
/>
</el-form-item>
</el-form>
<template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"cmdVisible = false"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"cmdVisible = false"
>
确定
</el-button>
</span>
</
template
>
</el-dialog>
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
,
watchEffect
}
from
'vue'
import
{
onMounted
,
onUnmounted
,
onUpdated
,
ref
,
watchEffect
}
from
'vue'
import
KitDevice
from
"../../components/kit-device.vue"
;
const
messages
=
ref
([
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
])
const
messages
=
ref
([
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
])
const
messageContainer
=
ref
(
null
);
const
messageContainer
=
ref
(
null
);
const
tag
=
ref
(
'real'
)
const
socket
=
ref
(
null
)
const
type1
=
ref
(
true
)
const
type2
=
ref
(
false
)
const
cmdVisible
=
ref
(
false
)
const
formLabelWidth
=
'140px'
const
cmds
=
ref
(
{
device
:
''
,
cmd_name
:
''
}
)
const
show
=
ref
(
false
)
function
scrollToBottom
()
{
function
scrollToBottom
()
{
if
(
messageContainer
.
value
)
{
if
(
messageContainer
.
value
)
{
...
@@ -47,12 +96,52 @@ function scrollToBottom() {
...
@@ -47,12 +96,52 @@ function scrollToBottom() {
}
}
}
}
watchEffect
(()
=>
{
onUpdated
(()
=>
{
// 在 messages 更新后滚动到底部
// 在 messages 更新后滚动到底部
scrollToBottom
();
scrollToBottom
();
});
});
onMounted
(()
=>
{
socket
.
value
=
new
WebSocket
(
'ws://'
+
'localhost:8000'
+
'/ws/chat/mqtt/'
)
socket
.
value
.
onmessage
=
(
e
)
=>
{
messages
.
value
.
push
(
e
.
data
)
}
scrollToBottom
();
})
const
showComponent
=
(
str
)
=>
{
if
(
str
===
'real'
){
type1
.
value
=
true
type2
.
value
=
false
}
else
if
(
str
===
'virtual'
){
type1
.
value
=
false
type2
.
value
=
true
}
tag
.
value
=
str
}
const
checkToShowInput
=
()
=>
{
show
.
value
=
cmds
.
value
.
device
&&
cmds
.
value
.
cmd_name
}
const
setting
=
()
=>
{
cmdVisible
.
value
=
true
// cmds.value.device = ''
// cmds.value.cmd_name = ''
for
(
const
key
in
cmds
.
value
){
cmds
.
value
[
key
]
=
''
}
show
.
value
=
false
}
</
script
>
</
script
>
<
style
>
<
style
>
.square-button
{
border-radius
:
0
;
}
</
style
>
</
style
>
\ No newline at end of file
frontend/src/views/protocol/protocol.vue
View file @
1afd0664
...
@@ -2,8 +2,7 @@
...
@@ -2,8 +2,7 @@
<div
class=
"button-container"
>
<div
class=
"button-container"
>
<el-button
class=
"left-button"
@
click=
"addProtocol = true"
>
新增协议
</el-button>
<el-button
class=
"left-button"
@
click=
"addProtocol = true"
>
新增协议
</el-button>
<div
class=
"right-buttons"
>
<div
class=
"right-buttons"
>
<el-button>
导入
</el-button>
<el-button>
导出数据库
</el-button>
<el-button>
导出所有协议
</el-button>
</div>
</div>
</div>
</div>
...
...
mqtt/mqtt.py
View file @
1afd0664
...
@@ -8,10 +8,10 @@ from .signals import mqtt_message_received
...
@@ -8,10 +8,10 @@ from .signals import mqtt_message_received
from
channels.layers
import
get_channel_layer
,
channel_layers
from
channels.layers
import
get_channel_layer
,
channel_layers
from
asgiref.sync
import
async_to_sync
from
asgiref.sync
import
async_to_sync
def
send_websocket_message
(
message
):
def
send_websocket_message
(
message
,
group_name
=
"chat_mqtt"
):
channel_layer
=
get_channel_layer
()
channel_layer
=
get_channel_layer
()
async_to_sync
(
channel_layer
.
group_send
)(
async_to_sync
(
channel_layer
.
group_send
)(
"chat_mqtt"
,
group_name
,
{
"type"
:
"chat.message"
,
"message"
:
message
}
{
"type"
:
"chat.message"
,
"message"
:
message
}
)
)
...
@@ -30,9 +30,11 @@ def on_message(mqtt_client, userdata, msg):
...
@@ -30,9 +30,11 @@ def on_message(mqtt_client, userdata, msg):
# mqtt_message_received.send(sender=None, message=msg.payload)
# mqtt_message_received.send(sender=None, message=msg.payload)
# print(f'Received message on topic: {msg.topic} with payload: {msg.payload}')
# print(f'Received message on topic: {msg.topic} with payload: {msg.payload}')
# data = parse_proto(msg.payload)
# data = parse_proto(msg.payload)
data
=
msg
.
payload
data
=
msg
.
payload
.
decode
(
'utf-8'
)
send_websocket_message
(
data
)
if
data
[
0
]
==
'0'
:
send_websocket_message
(
data
)
else
:
send_websocket_message
(
data
,
"chat_123"
)
client
=
mqtt
.
Client
()
client
=
mqtt
.
Client
()
client
.
on_connect
=
on_connect
client
.
on_connect
=
on_connect
...
...
vue_django/settings.py
View file @
1afd0664
...
@@ -31,8 +31,8 @@ ALLOWED_HOSTS = ['*']
...
@@ -31,8 +31,8 @@ ALLOWED_HOSTS = ['*']
# Application definition
# Application definition
INSTALLED_APPS
=
[
INSTALLED_APPS
=
[
#
'daphne',
'daphne'
,
#
'chat',
'chat'
,
'device_data_op'
,
'device_data_op'
,
'protocol_version_manage'
,
'protocol_version_manage'
,
...
@@ -43,6 +43,7 @@ INSTALLED_APPS = [
...
@@ -43,6 +43,7 @@ INSTALLED_APPS = [
'django.contrib.messages'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
'django.contrib.staticfiles'
,
'corsheaders'
,
'rest_framework'
,
'rest_framework'
,
'drf_yasg'
,
'drf_yasg'
,
]
]
...
@@ -50,6 +51,7 @@ INSTALLED_APPS = [
...
@@ -50,6 +51,7 @@ INSTALLED_APPS = [
MIDDLEWARE
=
[
MIDDLEWARE
=
[
'django.middleware.security.SecurityMiddleware'
,
'django.middleware.security.SecurityMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'corsheaders.middleware.CorsMiddleware'
,
'django.middleware.common.CommonMiddleware'
,
'django.middleware.common.CommonMiddleware'
,
# 'django.middleware.csrf.CsrfViewMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
...
@@ -159,3 +161,18 @@ CHANNEL_LAYERS = {
...
@@ -159,3 +161,18 @@ CHANNEL_LAYERS = {
# },
# },
# },
# },
}
}
CORS_ALLOW_CREDENTIALS
=
True
CORS_ORIGIN_ALLOW_ALL
=
True
CORS_ALLOW_HEADERS
=
[
'x-requested-with'
,
'content-type'
,
'accept'
,
'origin'
,
'authorization'
,
'x-csrftoken'
,
'token'
]
CORS_ALLOWED_ORIGINS
=
[
"http://localhost:5173"
,
# 您的前端应用地址
]
vue_django/urls.py
View file @
1afd0664
...
@@ -33,8 +33,8 @@ urlpatterns = [
...
@@ -33,8 +33,8 @@ urlpatterns = [
path
(
'admin/'
,
admin
.
site
.
urls
),
path
(
'admin/'
,
admin
.
site
.
urls
),
path
(
""
,
index
),
path
(
""
,
index
),
# path("test/", test),
# path("test/", test),
#
path("mqtt/", include("mqtt.urls")),
path
(
"mqtt/"
,
include
(
"mqtt.urls"
)),
#
path("chat/", include("chat.urls")),
path
(
"chat/"
,
include
(
"chat.urls"
)),
path
(
"op/"
,
include
(
"device_data_op.urls"
)),
path
(
"op/"
,
include
(
"device_data_op.urls"
)),
re_path
(
r'^swagger/$'
,
schema_view
.
with_ui
(
'swagger'
,
cache_timeout
=
0
),
name
=
'schema-swagger-ui'
),
re_path
(
r'^swagger/$'
,
schema_view
.
with_ui
(
'swagger'
,
cache_timeout
=
0
),
name
=
'schema-swagger-ui'
),
...
...
xdc.sqlite
View file @
1afd0664
No preview for this file type
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