567 lines
22 KiB
Vue
567 lines
22 KiB
Vue
<template>
|
|
<view class="voice-control">
|
|
<!-- 模块信息卡片 -->
|
|
<view class="card">
|
|
<view class="status-titletop">模块信息</view>
|
|
<view style="padding:20rpx;">
|
|
<u--form labelPosition="left" labelWidth="100"
|
|
:labelStyle="{ marginRight: '16px', lineHeight: '32px', width: '50px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: '#000000' }">
|
|
<view class="version-wrap">
|
|
<u-form-item label="固件版本">
|
|
<u--text :text="'Version ' + firmwareVersion"></u--text>
|
|
</u-form-item>
|
|
</view>
|
|
<view class="version-wrap">
|
|
<u-form-item label="MAC地址">
|
|
<u--text :text="macAddress"></u--text>
|
|
</u-form-item>
|
|
</view>
|
|
</u--form>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 网络设置卡片 -->
|
|
<view class="card basic-info">
|
|
<view class="section-title">网络设置</view>
|
|
<view class="info-content">
|
|
<u-form labelPosition="left" labelWidth="120">
|
|
<u-form-item label="网络ID">
|
|
<view class="picker-input">
|
|
{{ networkIdOptions[networkIdIndex].label }}
|
|
<picker
|
|
:range="networkIdOptions"
|
|
range-key="label"
|
|
@change="onNetworkIdChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="频段">
|
|
<view class="picker-input">
|
|
{{ frequencyBandOptions[frequencyBandIndex].label }}
|
|
<picker
|
|
:range="frequencyBandOptions"
|
|
range-key="label"
|
|
@change="onFrequencyBandChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="信道">
|
|
<view class="picker-input">
|
|
{{ channelOptions[channelIndex].label }}
|
|
<picker
|
|
:range="channelOptions"
|
|
range-key="label"
|
|
@change="onChannelChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="速率">
|
|
<view class="picker-input">
|
|
{{ rateOptions[rateIndex].label }}
|
|
<picker
|
|
:range="rateOptions"
|
|
range-key="label"
|
|
@change="onRateChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="功率">
|
|
<view class="picker-input">
|
|
{{ powerOptions[powerIndex].label }}
|
|
<picker
|
|
:range="powerOptions"
|
|
range-key="label"
|
|
@change="onPowerChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
</u-form>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 雷达触发设置卡片 -->
|
|
<view class="card">
|
|
<view class="section-title">雷达触发设置</view>
|
|
<view class="info-content">
|
|
<u-form labelPosition="left" labelWidth="120">
|
|
<u-form-item label="低速区间">
|
|
<view style="display: flex; align-items: center;">
|
|
<view class="picker-input" style="flex:2; margin-right: 10rpx;">
|
|
{{ lowSpeedMin }}
|
|
<picker
|
|
:range="speedOptions"
|
|
@change="onLowSpeedMinChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin: 0 10rpx;">~</text>
|
|
<view class="picker-input" style="flex:2;">
|
|
{{ lowSpeedMax }}
|
|
<picker
|
|
:range="speedOptions"
|
|
@change="onLowSpeedMaxChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin-left: 10rpx;">km/h</text>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="触发速度区间">
|
|
<view style="display: flex; align-items: center;">
|
|
<view class="picker-input" style="flex:2; margin-right: 10rpx;">
|
|
{{ triggerSpeedMin }}
|
|
<picker
|
|
:range="triggerSpeedOptions"
|
|
@change="onTriggerSpeedMinChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin: 0 10rpx;">~</text>
|
|
<view class="picker-input" style="flex:2;">
|
|
{{ triggerSpeedMax }}
|
|
<picker
|
|
:range="triggerSpeedOptions"
|
|
@change="onTriggerSpeedMaxChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin-left: 10rpx;">km/h</text>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="超速速度区间">
|
|
<view style="display: flex; align-items: center;">
|
|
<view class="picker-input" style="flex:2; margin-right: 10rpx;">
|
|
{{ overSpeedMin }}
|
|
<picker
|
|
:range="overSpeedOptions"
|
|
@change="onOverSpeedMinChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin: 0 10rpx;">~</text>
|
|
<view class="picker-input" style="flex:2;">
|
|
{{ overSpeedMax }}
|
|
<picker
|
|
:range="overSpeedOptions"
|
|
@change="onOverSpeedMaxChange"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
<text style="margin-left: 10rpx;">km/h</text>
|
|
</view>
|
|
</u-form-item>
|
|
</u-form>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 事件列表 -->
|
|
<view class="card audio-list">
|
|
<view class="section-title">
|
|
<text>事件列表</text>
|
|
<image src="https://xaznkj.cn/doc/photo/add.svg " mode="aspectFit" class="add-icon"
|
|
@click="showAddEventModal = true"></image>
|
|
</view>
|
|
<view class="list-container">
|
|
<view class="empty-tip" v-if="eventList.length === 0">
|
|
<u-icon name="file" size="50" color="#c0c4cc"></u-icon>
|
|
<text>暂无事件</text>
|
|
</view>
|
|
<view class="audio-item" v-for="(item, index) in eventList" :key="index">
|
|
<view class="audio-info">
|
|
<u-icon name="arrow-right" size="18" color="#2979ff"></u-icon>
|
|
<text class="audio-name">{{ item.type }} - {{ item.source }}</text>
|
|
</view>
|
|
<view class="audio-actions">
|
|
<text class="audio-duration">{{ item.priority }}</text>
|
|
<u-icon name="trash" size="18" color="#ff4d4f" @click="deleteEvent(index)"></u-icon>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 添加事件弹窗 -->
|
|
<u-popup :show="showAddEventModal" mode="center" @close="showAddEventModal = false" round="8">
|
|
<view class="add-audio-modal">
|
|
<view class="modal-title">添加事件</view>
|
|
<view class="modal-content">
|
|
<u-form ref="eventForm">
|
|
<u-form-item label="事件类型">
|
|
<view class="picker-input">
|
|
{{ eventTypeOptions[newEvent.type] || '请选择' }}
|
|
<picker
|
|
:range="eventTypeOptions"
|
|
@change="onEventPickerChange('type', $event)"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="事件来源">
|
|
<view class="picker-input">
|
|
{{ eventSourceOptions[newEvent.source] || '请选择' }}
|
|
<picker
|
|
:range="eventSourceOptions"
|
|
@change="onEventPickerChange('source', $event)"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="优先级">
|
|
<view class="picker-input">
|
|
{{ priorityOptions[newEvent.priority] || '请选择' }}
|
|
<picker
|
|
:range="priorityOptions"
|
|
@change="onEventPickerChange('priority', $event)"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="输出引脚">
|
|
<view class="picker-input">
|
|
{{ pinOutputOptions[newEvent.pinOutput] || '请选择' }}
|
|
<picker
|
|
:range="pinOutputOptions"
|
|
@change="onEventPickerChange('pinOutput', $event)"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
<u-form-item label="高低电平">
|
|
<view class="picker-input">
|
|
{{ highLowLevelOptions[newEvent.highLowLevel] || '请选择' }}
|
|
<picker
|
|
:range="highLowLevelOptions"
|
|
@change="onEventPickerChange('highLowLevel', $event)"
|
|
style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;"
|
|
/>
|
|
</view>
|
|
</u-form-item>
|
|
</u-form>
|
|
</view>
|
|
<view class="modal-footer">
|
|
<u-button @click="showAddEventModal = false" plain size="small">取消</u-button>
|
|
<u-button type="primary" @click="addEvent" size="small">确定</u-button>
|
|
</view>
|
|
</view>
|
|
</u-popup>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
// 模块信息
|
|
firmwareVersion: 'v1.0.0',
|
|
macAddress: '00:1A:2B:3C:4D:5E',
|
|
|
|
// 网络设置
|
|
networkIdOptions: [
|
|
{ label: 'ID1', value: 'ID1' },
|
|
{ label: 'ID2', value: 'ID2' },
|
|
{ label: 'ID3', value: 'ID3' }
|
|
],
|
|
networkIdIndex: 0,
|
|
frequencyBandOptions: [
|
|
{ label: '2.4GHz', value: '2.4GHz' },
|
|
{ label: '5GHz', value: '5GHz' }
|
|
],
|
|
frequencyBandIndex: 0,
|
|
channelOptions: [
|
|
{ label: '1', value: '1' },
|
|
{ label: '6', value: '6' },
|
|
{ label: '11', value: '11' }
|
|
],
|
|
channelIndex: 0,
|
|
rateOptions: [
|
|
{ label: '54Mbps', value: '54Mbps' },
|
|
{ label: '150Mbps', value: '150Mbps' }
|
|
],
|
|
rateIndex: 0,
|
|
powerOptions: [
|
|
{ label: '20dBm', value: '20dBm' },
|
|
{ label: '30dBm', value: '30dBm' }
|
|
],
|
|
powerIndex: 0,
|
|
|
|
// 雷达触发设置
|
|
lowSpeed: 0,
|
|
triggerSpeed: 0,
|
|
overSpeed: 0,
|
|
speedOptions: Array.from({length: 101}, (_, i) => i),
|
|
lowSpeedMin: 0,
|
|
lowSpeedMax: 100,
|
|
triggerSpeedOptions: Array.from({length: 151}, (_, i) => i),
|
|
triggerSpeedMin: 0,
|
|
triggerSpeedMax: 150,
|
|
overSpeedOptions: Array.from({length: 201}, (_, i) => i),
|
|
overSpeedMin: 0,
|
|
overSpeedMax: 200,
|
|
|
|
// 事件管理
|
|
showAddEventModal: false,
|
|
newEvent: {
|
|
type: '',
|
|
source: '',
|
|
priority: '',
|
|
pinOutput: '',
|
|
highLowLevel: ''
|
|
},
|
|
eventList: [],
|
|
|
|
// 下拉选项数据
|
|
eventTypeOptions: ['运动', '振动', '温度', '湿度'],
|
|
eventSourceOptions: ['传感器A', '传感器B', '手动', '自动'],
|
|
priorityOptions: ['高', '中', '低'],
|
|
pinOutputOptions: ['引脚1', '引脚2', '引脚3', '引脚4'],
|
|
highLowLevelOptions: ['高电平', '低电平']
|
|
};
|
|
},
|
|
methods: {
|
|
onNetworkIdChange(e) {
|
|
this.networkIdIndex = e.detail.value;
|
|
},
|
|
onFrequencyBandChange(e) {
|
|
this.frequencyBandIndex = e.detail.value;
|
|
},
|
|
onChannelChange(e) {
|
|
this.channelIndex = e.detail.value;
|
|
},
|
|
onRateChange(e) {
|
|
this.rateIndex = e.detail.value;
|
|
},
|
|
onPowerChange(e) {
|
|
this.powerIndex = e.detail.value;
|
|
},
|
|
onSliderChange(field, e) {
|
|
this[field] = e.detail.value;
|
|
},
|
|
onLowSpeedMinChange(e) {
|
|
const val = this.speedOptions[e.detail.value];
|
|
this.lowSpeedMin = val;
|
|
if (this.lowSpeedMax < val) this.lowSpeedMax = val;
|
|
},
|
|
onLowSpeedMaxChange(e) {
|
|
const val = this.speedOptions[e.detail.value];
|
|
this.lowSpeedMax = val;
|
|
if (this.lowSpeedMin > val) this.lowSpeedMin = val;
|
|
},
|
|
onTriggerSpeedMinChange(e) {
|
|
const val = this.triggerSpeedOptions[e.detail.value];
|
|
this.triggerSpeedMin = val;
|
|
if (this.triggerSpeedMax < val) this.triggerSpeedMax = val;
|
|
},
|
|
onTriggerSpeedMaxChange(e) {
|
|
const val = this.triggerSpeedOptions[e.detail.value];
|
|
this.triggerSpeedMax = val;
|
|
if (this.triggerSpeedMin > val) this.triggerSpeedMin = val;
|
|
},
|
|
onOverSpeedMinChange(e) {
|
|
const val = this.overSpeedOptions[e.detail.value];
|
|
this.overSpeedMin = val;
|
|
if (this.overSpeedMax < val) this.overSpeedMax = val;
|
|
},
|
|
onOverSpeedMaxChange(e) {
|
|
const val = this.overSpeedOptions[e.detail.value];
|
|
this.overSpeedMax = val;
|
|
if (this.overSpeedMin > val) this.overSpeedMin = val;
|
|
},
|
|
onEventPickerChange(field, e) {
|
|
this.newEvent[field] = e.detail.value;
|
|
},
|
|
addEvent() {
|
|
if ([this.newEvent.type, this.newEvent.source, this.newEvent.priority, this.newEvent.pinOutput, this.newEvent.highLowLevel].every(v => v !== '')) {
|
|
const event = {
|
|
type: this.eventTypeOptions[this.newEvent.type],
|
|
source: this.eventSourceOptions[this.newEvent.source],
|
|
priority: this.priorityOptions[this.newEvent.priority],
|
|
pinOutput: this.pinOutputOptions[this.newEvent.pinOutput],
|
|
highLowLevel: this.highLowLevelOptions[this.newEvent.highLowLevel]
|
|
};
|
|
this.eventList.push(event);
|
|
this.newEvent = {
|
|
type: '',
|
|
source: '',
|
|
priority: '',
|
|
pinOutput: '',
|
|
highLowLevel: ''
|
|
};
|
|
this.showAddEventModal = false;
|
|
} else {
|
|
uni.showToast({ title: '请填写完整信息', icon: 'none' });
|
|
}
|
|
},
|
|
deleteEvent(index) {
|
|
this.eventList.splice(index, 1);
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
// @import "@/uni_modules/uview-ui/scss/index.scss";
|
|
.voice-control {
|
|
padding: 20rpx;
|
|
background-color: #f7f8fa;
|
|
min-height: 100vh;
|
|
.card {
|
|
background-color: #fff;
|
|
border-radius: 16rpx;
|
|
margin-bottom: 20rpx;
|
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
|
|
overflow: hidden;
|
|
}
|
|
.status-titletop {
|
|
font-weight: bold;
|
|
font-size: 15px;
|
|
color: #333333;
|
|
line-height: 42rpx;
|
|
text-align: left;
|
|
padding: 15rpx 28rpx;
|
|
background-color: #eef6ff;
|
|
border-bottom: 1rpx solid #dceaff;
|
|
}
|
|
.version-wrap {
|
|
background-color: #F7F7F7;
|
|
border-radius: 10rpx;
|
|
padding: 0 42rpx;
|
|
font-size: 24rpx;
|
|
color: #000000;
|
|
line-height: 42rpx;
|
|
}
|
|
.section-title {
|
|
font-size: 30rpx;
|
|
font-weight: 600;
|
|
color: #333;
|
|
padding: 24rpx;
|
|
border-bottom: 1rpx solid #f5f5f5;
|
|
display: flex;
|
|
align-items: center;
|
|
.add-icon {
|
|
width: 40rpx;
|
|
height: 40rpx;
|
|
margin-left: auto;
|
|
}
|
|
}
|
|
.info-content {
|
|
padding: 16rpx 24rpx 24rpx;
|
|
}
|
|
.picker-value {
|
|
height: 80rpx;
|
|
line-height: 80rpx;
|
|
font-size: 28rpx;
|
|
color: #333;
|
|
padding: 0 20rpx;
|
|
background-color: #f9f9f9;
|
|
border-radius: 8rpx;
|
|
}
|
|
.audio-list {
|
|
.list-container {
|
|
padding: 0 24rpx;
|
|
}
|
|
.empty-tip {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 60rpx 0;
|
|
color: #c0c4cc;
|
|
font-size: 28rpx;
|
|
gap: 20rpx;
|
|
opacity: 0.8;
|
|
transition: all 0.3s ease;
|
|
&:active {
|
|
transform: scale(0.98);
|
|
opacity: 0.6;
|
|
}
|
|
}
|
|
.audio-item {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 20rpx 0;
|
|
border-bottom: 1rpx solid #f5f5f5;
|
|
&:last-child {
|
|
border-bottom: none;
|
|
}
|
|
.audio-info {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 16rpx;
|
|
}
|
|
.audio-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 24rpx;
|
|
}
|
|
}
|
|
}
|
|
.add-audio-modal {
|
|
width: 80vw;
|
|
max-width: 600rpx;
|
|
padding: 0;
|
|
border-radius: 16rpx;
|
|
background-color: #fff;
|
|
overflow: hidden;
|
|
.modal-title {
|
|
font-size: 30rpx;
|
|
font-weight: 600;
|
|
color: #333;
|
|
padding: 28rpx 28rpx 20rpx;
|
|
text-align: center;
|
|
border-bottom: 1rpx solid #f5f5f5;
|
|
}
|
|
.modal-content {
|
|
padding: 0 28rpx;
|
|
margin: 20rpx 0;
|
|
max-height: 60vh;
|
|
overflow-y: auto;
|
|
.u-form-item {
|
|
padding: 20rpx 0;
|
|
}
|
|
}
|
|
.modal-footer {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
padding: 16rpx 28rpx 28rpx;
|
|
border-top: 1rpx solid #f5f5f5;
|
|
.u-button {
|
|
width: 48%;
|
|
height: 72rpx;
|
|
font-size: 26rpx;
|
|
border-radius: 40rpx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.picker-input {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 80rpx;
|
|
line-height: 80rpx;
|
|
background: #f7f7f7;
|
|
border-radius: 10rpx;
|
|
padding: 0 24rpx;
|
|
font-size: 28rpx;
|
|
color: #333;
|
|
border: 1rpx solid #e5e5e5;
|
|
margin-bottom: 10rpx;
|
|
overflow: hidden;
|
|
}
|
|
.slider-value {
|
|
margin-top: 10rpx;
|
|
color: #2979ff;
|
|
font-size: 26rpx;
|
|
}
|
|
.full-width-slider {
|
|
width: 100%;
|
|
min-width: 200rpx;
|
|
max-width: 100%;
|
|
display: block;
|
|
margin: 0;
|
|
}
|
|
</style> |