Commit 1afd0664 by qianmo

update: 修改字段

parent e853217f
......@@ -73,9 +73,9 @@ class ChatConsumer(AsyncWebsocketConsumer):
# Receive message from room group
async def chat_message(self, event):
message = event["message"]
# Send message to WebSocket
# await self.send(text_data=json.dumps({"message": message}))
await self.send(bytes_data=message)
print(message)
await self.send(text_data=json.dumps({"message": message}))
# await self.send(bytes_data=message)
......@@ -13,14 +13,11 @@
</div>
</div>
<div class="mb-4 mt-4">协议指令</div>
<div class="mb-4 mt-4">协议规范</div>
<el-collapse class="mt-4">
<el-collapse-item title="HY_ACU7M5_PositionSet&nbsp;&nbsp;&nbsp;XY置位指令&nbsp;&nbsp;&nbsp;Tx" name="1">
<protpcol-table></protpcol-table>
</el-collapse-item>
<el-collapse-item title="HY_ACU7M5_MoveStop&nbsp;&nbsp;&nbsp;停止运动指令&nbsp;&nbsp;&nbsp;Tx" name="2">
<protpcol-table></protpcol-table>
<el-collapse-item v-for="cmd in parentMsg" :title="cmd.cmd_name+' '+cmd.cmd_explain+' '+cmd.cmd_type">
<protpcol-table v-if="protocolCmd" :info="cmd.cmd_name" :message="protocolCmd"></protpcol-table>
</el-collapse-item>
</el-collapse>
......@@ -64,13 +61,24 @@
</template>
<script setup>
import {ref} from 'vue'
import {ref, toRefs} from 'vue'
import {ElMessage, ElMessageBox} from "element-plus";
import ProtpcolTable from "./protpcol-table.vue";
const addCmd = ref(false)
const option = ref('option')
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 = () => {
ElMessageBox.confirm(
......@@ -100,9 +108,6 @@ const open = () => {
<style>
.container {
/*width: 100%;*/
/*border: 1px solid;*/
display: flex;
justify-content: space-between; /* 使内部元素平均分布 */
align-items: center; /* 垂直居中 */
......
<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
<template>
<div class="demo-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%">
<collapse-table class="mt-4"></collapse-table>
</div>
</el-collapse-item>
<el-collapse-item title=" HY_HWF0355-0357FC_PROTOCOL" name="2">
<div style="margin: auto; width: 90%">
<collapse-table class="mt-4"></collapse-table>
</div>
</el-collapse-item>
<el-collapse-item title="HY_DualChannelLBandOpticalTransceiver_PROTOCOL" name="3">
<div style="margin: auto; width: 90%">
<collapse-table class="mt-4"></collapse-table>
<collapse-table
v-if="protocolcmd"
class="mt-4"
:info="parentMsg"
:name="item"
:protocolcmd="protocolcmd"
>
</collapse-table>
</div>
</el-collapse-item>
</el-collapse>
......@@ -23,15 +21,25 @@
<script setup>
import {ref, onMounted } from '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(){
let data = await DeviceProtocol()
console.log(data)
protocols.value = data.fields
parentMsg.value = data
}
onMounted(() => {
getDeviceProtocol()
async function getProtocolCmd(){
let cmds = await ProtocolCmd()
protocolcmd.value = cmds
}
onMounted(async () => {
await getDeviceProtocol()
await getProtocolCmd()
})
</script>
......
<template>
<div class="mt-10" v-for="item in deviceData">
<span>{{item.name}}</span>
<div id="flex-container" class="mt-4">
<div class="flex-item">端口号:</div>
<div class="flex-item">
<el-input v-model="item.portNumber" ></el-input>
</div>
<div class="flex-item">开关:</div>
<div class="flex-item">
<el-switch v-model="item.switchValue"></el-switch>
</div>
</div>
<DeviceTable v-if="tag" :tag="tag"></DeviceTable>
<div style="display: flex; justify-content: center;">
<el-button
class="mt-2" style="width: 95%;border: 1px dashed"
@click="open"
>+</el-button>
</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>
<script setup>
import { ref } from 'vue'
import {onMounted, ref, toRefs, watch} from 'vue'
import DeviceTable from "./device-table.vue";
const deviceData = ref([
{ name: '7M5ACU', portNumber: '1111', switchValue: true},
{ name: '变频器', portNumber: '0000', switchValue: false}
])
</script>
const deviceVisible = ref(false)
const virtualDeviceVisible = ref(false)
const formLabelWidth = '140px'
const device = ref({mode: ''})
const virtualDevice = ref(
{protocol: '', version: '', mode: '', ip: '', port: ''}
)
const props = defineProps({
tag: String
})
const tag = ref(toRefs(props).tag.value)
<style>
#flex-container {
display: flex;
align-items: center;
const open = () => {
if (toRefs(props).tag.value === 'real'){
deviceVisible.value = true
}else {
virtualDeviceVisible.value = true
}
}
.flex-item {
margin-right: 20px;
}
watch( () => toRefs(props).tag.value, (newValue) => {
tag.value = newValue
})
</script>
<style scoped>
</style>
\ No newline at end of file
<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column fixed prop="FieldName" label="字段名" style="width: 25%" />
<el-table-column prop="FieldLength" label="字段长度" style="width: 25%" />
<el-table-column prop="Value" label="默认值" style="width: 25%" />
<el-table
:data="tableData"
style="width: 100%"
>
<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%">
<template #default="{row}">
<div style="display: flex; justify-content: space-between;">
......@@ -25,31 +28,31 @@
<el-row>
<el-col :span="12">
<el-form-item label="命令名">
<el-input v-model="fields.cmdName"></el-input>
<el-input v-model="fields.cmd_name" :disabled="!flag"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指令类型">
<el-input v-model="fields.cmdType"></el-input>
<el-input v-model="fields.cmd_type" :disabled="!flag"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<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-col>
<el-col :span="12">
<el-form-item label="名称">
<el-input v-model="fields.name"></el-input>
<el-input v-model="fields.fieldname"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="长度">
<el-input v-model="fields.length"></el-input>
<el-input v-model="fields.fieldsize"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
......@@ -61,19 +64,19 @@
<el-row>
<el-col :span="12">
<el-form-item label="指令最大值">
<el-input v-model="fields.cmdMax"></el-input>
<el-input v-model="fields.maxvalue"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指令最小值">
<el-input v-model="fields.cmdMin"></el-input>
<el-input v-model="fields.minvalue"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="字段类型">
<el-select v-model="fields.fieldType">
<el-select v-model="fields.datatype">
<el-option v-for="item in fieldTypes" :label="item.label" :value="item.value" :key="item.value"></el-option>
</el-select>
</el-form-item>
......@@ -81,56 +84,64 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="输入数据操作">
<el-input></el-input>
<el-form-item label="Lua对输入数据的操作">
<el-input v-model="fields.lua_script_in"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输入数据操作参数">
<el-input></el-input>
<el-form-item label="Lua对输出数据的操作">
<el-input v-model="fields.lua_script_out"></el-input>
</el-form-item>
</el-col>
</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-form-item label="输数据操作">
<el-input></el-input>
<el-form-item label="输数据操作">
<el-input v-model="fields.operation_in"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输数据操作参数">
<el-input></el-input>
<el-form-item label="输数据操作参数">
<el-input v-model="fields.operation_in_num"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row v-if="more">
<el-col :span="12">
<el-form-item label="输入数据字节操作">
<el-input></el-input>
<el-form-item label="输出数据操作">
<el-input v-model="fields.operation_out"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输出数据字节操作">
<el-input></el-input>
<el-form-item label="输出数据操作参数">
<el-input v-model="fields.operation_out_num"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row v-if="more">
<el-col :span="12">
<el-form-item label="Lua对输入数据的操作">
<el-input></el-input>
<el-form-item label="输入数据字节操作">
<el-input v-model="fields.operabo_in"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="Lua对输出数据的操作">
<el-input></el-input>
<el-form-item label="输出数据字节操作">
<el-input v-model="fields.operabo_out"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #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>
......@@ -140,41 +151,45 @@
</template>
<script setup>
import {ref} from 'vue'
import {ref,toRefs} from 'vue'
import {ElMessage, ElMessageBox} from "element-plus";
import {DeleteProtocolCmd, EditProtocolCmd} from "../dao/device";
const flag = ref(false)
const dialogVisible = ref(false)
const tableData = [
{
FieldName: 'Cmds',
FieldLength: 3,
Value: '$XY',
},
{
FieldName: 'Comma',
FieldLength: 1,
Value: ',',
},
]
const more = ref(false)
const props = defineProps({
//子组件接收父组件传递过来的值
info: String,
message: Object
})
const cmdName = ref(toRefs(props).info.value)
const cmdFields = ref(toRefs(props).message.value[cmdName.value])
const tableData = ref([])
for (const item of cmdFields.value){
tableData.value.push(item)
}
const fields = ref({
cmdName: '',
cmdType: '',
index: '',
name: '',
length: '',
cmd_name: '',
cmd_type: '',
fieldindex: '',
fieldname: '',
fieldsize: '',
value: '',
cmdMax: '',
cmdMin: '',
fieldType: '',
inputDataAction: '',
inputDataActionParam: '',
outputDataAction: '',
outputDataActionParam: '',
inputDataByteAction: '',
outputDataByteAction: '',
LuaInput: '',
LuaOutput: ''
minvalue: '',
maxvalue: '',
datatype: '',
operation_in: '',
operation_in_num: '',
operation_out: '',
operation_out_num: '',
operabo_in: '',
operabo_out: '',
lua_script_in: '',
lua_script_out: ''
})
const fieldTypes = [
{ value: 0, label: 'DATATYPE_DEFAULT'},
......@@ -195,6 +210,7 @@ const fieldTypes = [
{ value: 15, label: 'DATATYPE_TIMESTR '},
{ value: 16, label: 'DATATYPE_MAX'},
]
let operation = ''
const addField = () => {
......@@ -208,14 +224,21 @@ const addField = () => {
function editField(data){
dialogVisible.value = true
flag.value = false
fields.value['cmdName'] = data.FieldName
fields.value['length'] = data.FieldLength
fields.value['value'] = data.Value
for (const key in data){
fields.value[key] = data[key]
}
}
function open(data){
console.log(data)
async function Edit(id, params){
await EditProtocolCmd(id, params)
}
async function Delete(id){
await DeleteProtocolCmd(id)
}
function open(data){
if (data === 'delete'){
operation = '删除'
} else if(flag.value){
......@@ -238,6 +261,19 @@ function open(data){
message: operation + '成功',
})
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(() => {
ElMessage({
......@@ -246,6 +282,7 @@ function open(data){
})
})
}
</script>
<style>
......
import axios from "axios"
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){
return response.data
}
......
......@@ -12,13 +12,27 @@
</div>
<div class="flex mt-4">
<el-input></el-input>
<el-button class="ml-4">设置指令</el-button>
<el-button class="ml-4" @click="setting">设置指令</el-button>
<el-button>发送指令</el-button>
</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>
......@@ -32,14 +46,49 @@
<el-button class="ml-4" size="large">导出</el-button>
</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>
<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 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() {
if (messageContainer.value) {
......@@ -47,12 +96,52 @@ function scrollToBottom() {
}
}
watchEffect(() => {
onUpdated(() => {
// 在 messages 更新后滚动到底部
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>
<style>
.square-button {
border-radius: 0;
}
</style>
\ No newline at end of file
......@@ -2,8 +2,7 @@
<div class="button-container">
<el-button class="left-button" @click="addProtocol = true">新增协议</el-button>
<div class="right-buttons">
<el-button>导入</el-button>
<el-button>导出所有协议</el-button>
<el-button>导出数据库</el-button>
</div>
</div>
......
......@@ -8,10 +8,10 @@ from .signals import mqtt_message_received
from channels.layers import get_channel_layer, channel_layers
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()
async_to_sync(channel_layer.group_send)(
"chat_mqtt",
group_name,
{"type": "chat.message", "message": message}
)
......@@ -30,9 +30,11 @@ def on_message(mqtt_client, userdata, msg):
# mqtt_message_received.send(sender=None, message=msg.payload)
# print(f'Received message on topic: {msg.topic} with payload: {msg.payload}')
# data = parse_proto(msg.payload)
data = msg.payload
data = msg.payload.decode('utf-8')
if data[0] == '0':
send_websocket_message(data)
else:
send_websocket_message(data, "chat_123")
client = mqtt.Client()
client.on_connect = on_connect
......
......@@ -31,8 +31,8 @@ ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
# 'daphne',
# 'chat',
'daphne',
'chat',
'device_data_op',
'protocol_version_manage',
......@@ -43,6 +43,7 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'drf_yasg',
]
......@@ -50,6 +51,7 @@ INSTALLED_APPS = [
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
......@@ -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", # 您的前端应用地址
]
......@@ -33,8 +33,8 @@ urlpatterns = [
path('admin/', admin.site.urls),
path("", index),
# path("test/", test),
# path("mqtt/", include("mqtt.urls")),
# path("chat/", include("chat.urls")),
path("mqtt/", include("mqtt.urls")),
path("chat/", include("chat.urls")),
path("op/", include("device_data_op.urls")),
re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
......
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment