iot-ui-app/pages/tabbar/config.vue

436 lines
9.1 KiB
Vue

<template>
<view class="container">
<!-- 域名列表 -->
<view class="domain-list" v-if="configList.length">
<view
class="domain-item"
:class="{'domain-item-active': configIndex === index}"
v-for="(item, index) in configList"
:key="item.id"
@click="changeConfig(index)"
>
<view class="domain-item-content">
<!-- 单选按钮 -->
<view class="radio-wrapper">
<u-radio-group v-model="configIndex">
<u-radio
:name="index"
size="40"
shape="circle"
activeColor="#2979ff"
></u-radio>
</u-radio-group>
</view>
<!-- 协议标签 -->
<view :class="['protocol-tag', item.protocol.includes('https') ? 'https' : 'http']">
<text>{{ item.protocol.includes('https') ? 'HTTPS' : 'HTTP' }}</text>
</view>
<!-- 域名 -->
<view class="domain-name">
<text>{{ item.address }}</text>
</view>
<!-- 操作按钮 -->
<view @click.stop="openEdit(index)" class="domain-item-btn">
<u-icon name="edit-pen" color="#2979ff" size="40"></u-icon>
</view>
<view @click.stop="delConfig(index)" class="domain-item-btn">
<u-icon name="trash" color="#fa3534" size="40"></u-icon>
</view>
</view>
</view>
</view>
<!-- 空状态 -->
<u-empty margin-top="200" v-else text="没有域名,请添加" mode="list"></u-empty>
<!-- 添加域名按钮 -->
<view class="add-button-wrapper">
<u-button
type="primary"
@click="openAdd"
>+ 添加域名</u-button>
</view>
<!-- 添加/编辑域名弹窗 -->
<u-modal v-model="show" width="700" :title="form.id ? '编辑域名' : '添加域名'" ref="uModal" :show-cancel-button="true" :mask-close-able="true" @confirm="addConfig">
<view class="slot-content">
<!-- 网络协议选择 -->
<view class="form-item">
<view class="form-label">
网络协议
</view>
<view class="form-value" @click="protocolShow=true">
{{ form.protocol ? form.protocol : '请选择' }}
<view class="arrow-icon">
<u-icon name="arrow-down" size="28"></u-icon>
</view>
</view>
</view>
<!-- 域名输入 -->
<view class="form-item">
<view class="form-label">
域名
</view>
<view class="form-value">
<input type="text" v-model="form.address" placeholder="请输入域名">
</view>
</view>
</view>
</u-modal>
<!-- 协议选择器 -->
<u-select v-model="protocolShow" :list="protocolList" @confirm="confirmProtocol"></u-select>
<!-- 提示框 -->
<u-toast ref="uToast" />
</view>
</template>
<script>
export default {
data() {
return {
configIndex: 0,
configList: [],
form: {
id: '',
protocol: '',
address: '',
},
protocolShow: false,
protocolList: [
{
value: 'https://',
label: 'HTTPS'
},
{
value: 'http://',
label: 'HTTP'
}
],
show: false,
};
},
onLoad() {
// 小程序只使用https
// #ifdef MP-WEIXIN
// this.protocolList = [
// {
// value: 'https://',
// label: 'HTTPS'
// }
// ]
// #endif
this.getConfigList();
},
methods: {
getConfigList() {
uni.getStorage({
key: 'configList',
}).then(res => {
// 如果返回数组为两位就是正确
if (res.length == 2) {
this.configList = res[1].data;
}
return uni.getStorage({
key: 'configIndex',
})
}).then(res => {
console.log("configIndex", res)
if (res.length == 2) {
this.configIndex = res[1].data;
}
})
},
changeConfig(i) {
console.log("index", i)
if (i !== this.configIndex) {
this.configIndex = i;
uni.setStorage({
key: 'configIndex',
data: i,
}).then(res => {
console.log("修改索引")
})
}
},
verification() {
if (!this.form.protocol) {
this.$refs.uToast.show({
title: '请先选择协议!',
type: 'error'
})
return false;
} else if (!this.form.address) {
this.$refs.uToast.show({
title: '请先输入地址',
type: 'error',
})
return false;
} else if (!this.$u.test.url(this.form.protocol + this.form.address)) {
this.$refs.uToast.show({
title: '请确认输入地址正确',
type: 'error',
})
return false;
} else {
return true;
}
},
openAdd() {
if (this.configList.length == 0) {
this.form = {
id: '',
protocol: 'http://',
address: '192.168.1.17:8848',
}
} else {
this.form = {
id: '',
protocol: '',
address: '',
}
}
this.show = true;
},
addConfig() {
console.log("添加页面", this.form)
if (this.verification()) {
if (this.form.id === '') {
// 新增
this.configList.push({
id: this.$u.guid(32),
protocol: this.form.protocol,
address: this.form.address,
})
uni.setStorage({
key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
title: '新增成功',
type: 'success',
})
})
if (this.configList.length == 1) {
uni.setStorage({
key: 'configIndex',
data: 0,
}).then(res => {
console.log("添加第一个域名索引为0")
})
}
this.show = false;
this.getConfigList()
console.log("configList", this.configList)
} else {
// 编辑
this.configList.map(item => {
if (item.id == this.form.id) {
item.protocol = this.form.protocol;
item.address = this.form.address;
}
return item;
})
uni.setStorage({
key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
title: '编辑成功',
type: 'success',
})
})
this.show = false;
this.getConfigList()
}
} else {
this.$refs.uModal.clearLoading();
}
},
confirmProtocol(e) {
this.form.protocol = e[0].value;
},
openEdit(index) {
console.log("编辑",index)
this.form = JSON.parse(JSON.stringify(this.configList[index]));
this.show = true;
},
delConfig(index) {
uni.showModal({
title: '提示',
content: '确认要删除域名吗?',
success: (res) => {
if (res.confirm) {
console.log('用户点击确定');
this.configList.splice(index, 1);
uni.setStorage({
key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
title: '删除成功',
type: 'success',
})
})
if (this.configIndex < index) {
} else {
if (this.configIndex > index) {
this.configIndex = this.configIndex - 1;
} else if (this.configIndex == index) {
if (this.configList.length == 0) {
this.configIndex = -1;
} else {
this.configIndex = 0;
}
}
uni.setStorage({
key: 'configIndex',
data: this.configIndex,
}).then(res => {
console.log("修改索引")
})
}
this.getConfigList();
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #F5F7FA;
}
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #F5F7FA;
padding: 20rpx;
}
.domain-list {
display: flex;
flex-direction: column;
gap: 20rpx;
margin-bottom: 120rpx; // 为底部按钮留出空间
}
.domain-item {
background-color: #ffffff;
border-radius: 12rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
&-content {
display: flex;
align-items: center;
padding: 35rpx 30rpx;
}
&-active {
background-color: #f0f7ff;
border: 1rpx solid #2979ff;
}
.domain-item-btn{
margin-left: 30rpx;
}
}
.radio-wrapper {
margin-right: 0rpx;
}
.protocol-tag {
padding: 4rpx 12rpx;
border-radius: 6rpx;
margin-right: 20rpx;
font-size: 26rpx;
&.https {
background-color: rgba(41, 121, 255, 0.1);
text {
color: #2979ff;
}
}
&.http {
background-color: rgba(255, 152, 0, 0.1);
text {
color: #ff9800;
}
}
}
.domain-name {
flex: 1;
text {
font-size: 28rpx;
}
}
.action-buttons {
display: flex;
gap: 30rpx;
view {
padding: 10rpx;
}
}
.add-button-wrapper {
padding: 30rpx 20rpx;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: #fff;
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.slot-content {
padding: 20rpx 30rpx;
}
.form-item {
margin-bottom: 30rpx;
.form-label {
font-size: 28rpx;
color: #666;
margin-bottom: 20rpx;
}
.form-value {
background-color: #f5f5f5;
border-radius: 8rpx;
height: 80rpx;
display: flex;
align-items: center;
padding: 0 20rpx;
position: relative;
input {
width: 100%;
height: 100%;
}
.arrow-icon {
position: absolute;
right: 20rpx;
}
}
}
</style>