vue 动态表单优秀案例

news2024/11/29 4:37:45

不同的下拉框 就会显示不同的表单,表单配置是灵活匹配的,还有就是 一定要知道都有哪些类型的数据做到兼容起来。

在这里插入图片描述

app.vue

<template>
  <a-select v-model:value="FormDataSelect" :options="FormDataSelectList" />

  <a-form class="FormView" :label-col="labelCol" v-if="FormData.BasicParam">

    <template v-for="(item, index) in formList.Data[FormDataSelect]">
      <div class="title" v-if="item.show">{{ item.title }}</div>
      <span v-if="item.show" v-for="(itemc, indexc) in item.children">
        <InputVue :key="'InputVue' + indexc" v-if="itemc.type === 'InputVue' && itemc.show" :label="itemc.name"
          v-model="itemc.value" />
        <SelectVue :key="'SelectVue' + indexc" v-if="itemc.type === 'SelectVue' && itemc.show" :label="itemc.name"
          :dist-name="itemc.distName" v-model="itemc.value" @select="selectValue(itemc)" />
        <InputNumberVue :key="'InputNumberVue' + indexc" v-if="itemc.type === 'InputNumberVue' && itemc.show"
          :label="itemc.name" :unit="itemc.unit" v-model="itemc.value" />
      </span>
    </template>

    <a-form-item class="ButtonView">
      <a-button type="primary" style="margin-left:150px" @click="ShowFormData">提交</a-button>
    </a-form-item>

  </a-form>

  <a-modal v-model:visible="visible" title="测试数据结果">
    <code>
      <pre>{{ Code }}</pre>
    </code>
  </a-modal>
</template>
<script setup>
import { nextTick, onMounted, ref, watch, reactive } from 'vue';
import { GetFormData } from './Apis.js'
import InputVue from './Input.vue';
import InputNumberVue from './InputNumber.vue';
import SelectVue from './Select.vue';

// 表单标签布局
const labelCol = ref({ style: { width: '150px', } });

// 表单数据
const FormData = ref({});
const FormDataSelect = ref('TestFormData1');
const FormDataSelectList = ref([
  { value: 'TestFormData1', label: '测试表单数据1', },
  { value: 'TestFormData2', label: '测试表单数据2', },
  { value: 'TestFormData3', label: '测试表单数据3', }
]);
let formList = reactive({ Data: {} })
function dataS(datas, key) {
  if (!formList.Data.hasOwnProperty(key)) {
    formList.Data[key] = []
    if (datas.BasicParam) {
      let BasicParam = {
        title: '装备信息',
        show: true,
        children: [{
          name: '装备名称',
          key: 'BasicParam.EquipModel',
          FormType: datas.BasicParam.FormType,
          EquipId: datas.BasicParam.EquipId,
          value: datas.BasicParam.EquipModel,
          type: 'InputVue',
          show: true,
        }, {
          name: '最大作用距离',
          key: 'BasicParam.Distance',
          value: datas.BasicParam.Distance,
          type: 'InputNumberVue',
          unit: 'km',
          show: true,
        }, {
          name: '收发共用天线',
          key: 'TranRevList[0].IsER',
          value: datas.TranRevList[0].IsER,
          type: 'SelectVue',
          distName: '是否类型',
          show: datas.TranRevList[0].TranParam != null && datas.TranRevList[0].RevParam != null,
        }]
      }
      formList.Data[key].push(BasicParam)
    }
    if (datas.TranRevList.length > 0) {
      if (datas.TranRevList[0].TranParam) {
        let TranParam = {
          title: '发射机参数',
          show: true,
          children: [{
            name: '频率类型',
            key: 'TranRevList[0].TranParam.FreqType',
            value: datas.TranRevList[0].TranParam.FreqType,
            type: 'SelectVue',
            distName: '频率类型',
            show: true,
          }, {
            name: '发射频率起',
            key: 'TranRevList[0].TranParam.FreqFrom',
            value: datas.TranRevList[0].TranParam.FreqFrom,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].TranParam.FreqType === '1' ? true : false,
          }, {
            name: '发射频率止',
            key: 'TranRevList[0].TranParam.FreqTo',
            value: datas.TranRevList[0].TranParam.FreqTo,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].TranParam.FreqType === '1' ? true : false,
          }, {
            name: '中心频率',
            key: 'TranRevList[0].TranParam.FreqCenter',
            value: datas.TranRevList[0].TranParam.FreqCenter,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].TranParam.FreqType === '0' ? true : false,
          }, {
            name: '占用带宽',
            key: 'TranRevList[0].TranParam.OccupyBand',
            value: datas.TranRevList[0].TranParam.OccupyBand,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].TranParam.FreqType === '0' ? true : false,
          }]
        }
        formList.Data[key].push(TranParam)
      }
      if (datas.TranRevList[0].TranAntData) {
        let TranAntData = {
          title: datas.TranRevList[0].IsER === '0' ? '发射机天线参数' : '公共天线参数',
          show: datas.TranRevList[0].IsER === '0' ? true : false,
          children: [{
            name: '天线类型',
            key: 'TranRevList[0].TranAntData.AntType',
            value: datas.TranRevList[0].TranAntData.AntType,
            type: 'SelectVue',
            distName: '天线类型',
            show: true,
          }, {
            name: '极化方式',
            key: 'TranRevList[0].TranAntData.Pola',
            value: datas.TranRevList[0].TranAntData.Pola,
            type: 'SelectVue',
            distName: '极化方式',
            show: true,
          }]
        }
        formList.Data[key].push(TranAntData)
      }
      if (datas.TranRevList[0].RevParam) {
        let RevParam = {
          title: '接收机参数',
          show: true,
          children: [{
            name: '频率类型',
            key: 'TranRevList[0].RevParam.FreqType',
            value: datas.TranRevList[0].RevParam.FreqType,
            type: 'SelectVue',
            distName: '频率类型',
            show: true,
          }, {
            name: '发射频率起',
            key: 'TranRevList[0].RevParam.FreqFrom',
            value: datas.TranRevList[0].RevParam.FreqFrom,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].RevParam.FreqType === '1' ? true : false,
          }, {
            name: '发射频率止',
            key: 'TranRevList[0].RevParam.FreqTo',
            value: datas.TranRevList[0].RevParam.FreqTo,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].RevParam.FreqType === '1' ? true : false,
          }, {
            name: '接收中心频率',
            key: 'TranRevList[0].RevParam.FreqCenter',
            value: datas.TranRevList[0].RevParam.FreqCenter,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].RevParam.FreqType === '0' ? true : false,
          }, {
            name: '接收带宽',
            key: 'TranRevList[0].RevParam.BandWidth',
            value: datas.TranRevList[0].RevParam.BandWidth,
            type: 'InputNumberVue',
            unit: 'MHz',
            show: datas.TranRevList[0].RevParam.FreqType === '0' ? true : false,
          }]
        }
        formList.Data[key].push(RevParam)
      }
      if (datas.TranRevList[0].RevAntData) {
        let RevAntData = {
          title: '接收机天线参数',
          show: true,
          children: [{
            name: '天线类型',
            key: 'TranRevList[0].RevAntData.AntType',
            value: datas.TranRevList[0].RevAntData.AntType,
            type: 'SelectVue',
            distName: '天线类型',
            show: true,
          }, {
            name: '极化方式',
            key: 'TranRevList[0].RevAntData.Pola',
            value: datas.TranRevList[0].RevAntData.Pola,
            type: 'SelectVue',
            distName: '极化方式',
            show: true,
          }]
        }
        formList.Data[key].push(RevAntData)
      }
      if (datas.TranRevList[0].TranAntData) {
        let TranAntData = {
          title: '公共天线参数',
          show: datas.TranRevList[0].IsER === '1' ? true : false,
          children: [{
            name: '天线类型',
            key: 'TranRevList[0].TranAntData.AntType',
            value: datas.TranRevList[0].TranAntData.AntType,
            type: 'SelectVue',
            distName: '天线类型',
            show: true,
          }, {
            name: '极化方式',
            key: 'TranRevList[0].TranAntData.Pola',
            value: datas.TranRevList[0].TranAntData.Pola,
            type: 'SelectVue',
            distName: '极化方式',
            show: true,
          }]
        }
        formList.Data[key].push(TranAntData)
      }
    }
  }
}
function selectValue(params) {
  // 收发共用天线
  if (params.key === "TranRevList[0].IsER") {
    let index = formList.Data[FormDataSelect.value].findIndex(item => { return item.title === '发射机天线参数' })
    let index2 = formList.Data[FormDataSelect.value].findIndex(item => { return item.title === '公共天线参数' })
    let index3 = formList.Data[FormDataSelect.value].findIndex(item => { return item.title === '接收机天线参数' })
    // 是1 否0
    formList.Data[FormDataSelect.value][index].show = params.value === '1' ? false : true
    formList.Data[FormDataSelect.value][index2].show = params.value === '1' ? true : false
    formList.Data[FormDataSelect.value][index3].show = params.value === '1' ? false : true
  }
  let arrl = ["TranRevList[0].RevParam.FreqType", "TranRevList[0].TranParam.FreqType"]
  if (arrl.includes(params.key)) {
    var TranParamindex1 = null;
    for (let index = 0; index < formList.Data[FormDataSelect.value].length; index++) {
      const array = formList.Data[FormDataSelect.value][index].children;
      for (let i = 0; i < array.length; i++) {
        const element = array[i];
        if (element.key === params.key) {
          TranParamindex1 = index
          break
        }
      }
    }
    formList.Data[FormDataSelect.value][TranParamindex1].children[1].show = params.value === '1' ? true : false
    formList.Data[FormDataSelect.value][TranParamindex1].children[2].show = params.value === '1' ? true : false
    formList.Data[FormDataSelect.value][TranParamindex1].children[3].show = params.value === '0' ? true : false
    formList.Data[FormDataSelect.value][TranParamindex1].children[4].show = params.value === '0' ? true : false
  }
}
onMounted(async () => {
  FormData.value = await GetFormData(FormDataSelect.value);
  dataS(FormData.value, FormDataSelect.value)
});

watch(FormDataSelect, (val) => {
  FormData.value = {};
  nextTick(async () => {
    FormData.value = await GetFormData(val);
    dataS(FormData.value, val)
  })
})

const Code = ref('');
const visible = ref(false);

const ShowFormData = () => {
  let formV = JSON.parse(JSON.stringify(formList.Data[FormDataSelect.value]))
  for (let index = 0; index < formV.length; index++) {
    const array = formV[index].children;
    for (let i = 0; i < array.length; i++) {
      let val = array[i].value
      new Function("val", "FormData", "FormData.value." + array[i].key + " = val")(val, FormData);
    }
  }
  Code.value = JSON.stringify(FormData.value, 1, '    ');
  visible.value = true
}
</script>

<style scoped>
.ButtonView {
  margin-top: 20px;
}

.FormView {
  width: 500px;
}

.title {
  padding: 10px;
  margin-bottom: 10px;
  border-bottom: 1px solid #434343;
}

:deep(.ant-form-item) {
  margin-bottom: 0px;
}
</style>

Input.vue

<template>
    <a-form-item :label="label">
        <a-input size="small" v-model:value="InputValue">
            <template #suffix>
                {{ unit }}
            </template>
        </a-input>
    </a-form-item>
</template>
<script setup>
import { ref, watch } from 'vue';

const emit = defineEmits(['update:modelValue'])
const props = defineProps({
    // 名称
    label: String,
    // 单位
    unit: String,
    // 表单数据
    modelValue: String,
});

const InputValue = ref();

watch(() => props.modelValue, val => {
    InputValue.value = val;
}, { immediate: true });

watch(InputValue, (val) => {
    emit('update:modelValue', val);
})

</script>
<style lang="less" scoped>

</style>

InputNumber.vue

<template>
    <a-form-item :label="label">
        <a-input-number size="small" style="width:100%" v-model:value="InputValue" :controls="false"
            :addon-after="unit" />
    </a-form-item>
</template>
<script setup>
import { ref, watch } from 'vue';

const emit = defineEmits(['update:modelValue'])
const props = defineProps({
    // 名称
    label: String,
    // 单位
    unit: String,
    // 表单数据
    modelValue: Number,
});

const InputValue = ref();

watch(() => props.modelValue, val => {
    InputValue.value = val;
}, { immediate: true });

watch(InputValue, (val) => {
    emit('update:modelValue', val);
})

</script>
<style lang="less" scoped>

</style>

Select.vue

<template>
    <a-form-item :label="label">
        <a-select size="small" v-model:value="SelectValue">
            <a-select-option v-for="item in Dist" :key="item.DM" :value="item.DM">
                {{ item.MC }}
            </a-select-option>
        </a-select>
    </a-form-item>
</template>
<script setup>
import { onMounted, ref, watch } from 'vue';
import { GetDist } from './Apis.js'
import { UseRateStore } from './store.js'
const store = UseRateStore();
const emit = defineEmits(['update:modelValue', 'select'])
const props = defineProps({
    // 名称
    label: String,
    // 字典名称
    distName: String || Array,
    // 表单数据
    modelValue: String || Number,
});

const SelectValue = ref();

watch(() => props.modelValue, val => {
    SelectValue.value = val;
}, { immediate: true });

watch(SelectValue, (val) => {
    emit('update:modelValue', val);
    emit('select', val);
})
// 字典列表
const Dist = ref([]);

onMounted(async () => {
    let item = store.getData(props.distName)
    if (item) {
        Dist.value = item
    } else {
        GetDist(props.distName).then(res => {
            store.setData({ key: props.distName, value: res })
            Dist.value = res
        });
    }
});

</script>
<style lang="less" scoped>

</style>

store.js

import {
    defineStore
} from 'pinia'
export const UseRateStore = defineStore('storeDist', {
    state: () => {
        return {
            DistData: {},
        }
    },
    getters: {

    },
    actions: {
        setData(data) {
            this.DistData[data.key] = data.value
        },
        getData(key) {
            return this.DistData[key] ? this.DistData[key] : null
        },
    }
});

Apis.js

// DMLX 代码类型
// DM 代码
// MC 名称
const Dist = {
    '频率类型': [
        { "DMLX": "频率类型", "DM": "0", "MC": "频点" },
        { "DMLX": "频率类型", "DM": "1", "MC": "频段" }
    ],
    '天线类型': [
        { "DMLX": "天线类型", "DM": "0", "MC": "全向天线" },
        { "DMLX": "天线类型", "DM": "1", "MC": "非全向天线" }
    ],
    '极化方式': [
        { "DMLX": "极化方式", "DM": "H", "MC": "水平线极化" },
        { "DMLX": "极化方式", "DM": "V", "MC": "垂直线极化" },
        { "DMLX": "极化方式", "DM": "CL", "MC": "左旋圆极化" },
        { "DMLX": "极化方式", "DM": "CR", "MC": "右旋圆极化" },
        { "DMLX": "极化方式", "DM": "OD", "MC": "正交双线极化" }
    ],
    '是否类型': [
        { "DMLX": "是否类型", "DM": "0", "MC": "否" },
        { "DMLX": "是否类型", "DM": "1", "MC": "是" }
    ],
}

const FormData = {
    'TestFormData1': { 
        "BasicParam": {
            "FormType": 10,
            "EquipId": 21985,
            "EquipModel": "测试装备类型1", // 装备名称
            "Distance": 555.6, // 最大作用距离
        },
        "TranRevList": [{
            "IsER": "0", // 是否公用天线
            "TranParam": { // 发射机
                "FreqType": "0", // 频率类型
                "FreqFrom": 7.4985, // 发射频率起
                "FreqTo": 7.5015, // 发射频率止
                "FreqCenter": 7.5, // 中心频率
                "OccupyBand": 0.003, // 占用带宽
            },
            "RevParam": { // 接收机
                "FreqType": "0",
                "FreqFrom": 7.4985, // 接收频率起
                "FreqTo": 7.5015, // 接收频率止
                "FreqCenter": 7.5, // 接收中心频率
                "BandWidth": 0.003, // 接收带宽
            },
            "TranAntData": { // 发射机天线参数
                "AntType": "0", // 天线类型
                "Pola": "H", // 极化方式
            },
            "RevAntData": { // 接收机天线参数
                "AntType": "0", // 天线类型
                "Pola": "H",// 极化方式
            }
        }]
    },
    'TestFormData2': {
        "BasicParam": {
            "FormType": 20,
            "EquipId": 21985,
            "EquipModel": "测试装备类型2", // 装备名称
            "Distance": 555.6, // 最大作用距离
        },
        "TranRevList": [{
            "IsER": "0", // 是否公用天线
            "TranParam": null,
            "RevParam": { // 接收机
                "FreqType": "0",
                "FreqFrom": 7.4985, // 接收频率起
                "FreqTo": 7.5015, // 接收频率止
                "FreqCenter": 7.5, // 接收中心频率
                "BandWidth": 0.003, // 接收带宽
            },
            "TranAntData": null,
            "RevAntData": { // 接收机天线参数
                "AntType": "0", // 天线类型
                "Pola": "H",// 极化方式
            },
        }]
    },
    'TestFormData3': {
        "BasicParam": {
            "FormType": 30,
            "EquipId": 21985,
            "EquipModel": "测试装备类型3", // 装备名称
            "Distance": 555.6, // 最大作用距离
        },
        "TranRevList": [{
            "IsER": "0", // 是否公用天线
            "TranParam": { // 发射机
                "FreqType": "0", // 频率类型
                "FreqFrom": 7.4985, // 发射频率起
                "FreqTo": 7.5015, // 发射频率止
                "FreqCenter": 7.5, // 中心频率
                "OccupyBand": 0.003, // 占用带宽
            },
            "RevParam": null,
            "TranAntData": { // 发射机天线参数
                "AntType": "0", // 天线类型
                "Pola": "H", // 极化方式
            },
            "RevAntData": null
        }]
    }
};

/**
 * 获取表单数据
 *
 * @export
 * @return {*} 
 */
export function GetFormData(TestKey = 'TestFormData1') {
    return new Promise((resolve, reject) => {
        resolve(FormData[TestKey]);
    });
};


/**
 * 获取字典数据
 *
 * @export
 * @param {String} DistName 字典名称
 * @return {Array} 字典项 
 */
export function GetDist(DistName) {
    return new Promise((resolve, reject) => {
        console.log('获取字典项' + DistName);
        if (Dist[DistName]) {
            resolve(Dist[DistName]);
        } else {
            console.error('字典不存在');
            reject('字典不存在');
        }
    });
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相控阵天线(五):稀疏阵列(概率密度稀疏法、多阶密度加权法、迭代傅里叶(IFT)法)

目录简介稀疏线阵概率密度稀疏法多阶密度加权法迭代傅里叶(IFT)综合法对称分布稀疏阵列建模仿真简介 稀疏阵是在不明显改变阵列波束宽度的情况下去掉一些阵元&#xff0c;可以用满阵列的几分之一的阵元构造一个减低了增益的高方向性阵列&#xff0c;符合大型阵列设计中降低成本…

【C++】哈希算法

目录 1.哈希映射 1.1哈希的概念 1.2哈希冲突 1.3哈希函数 1.31直接定值法 1.32除留余数法 2.解决哈希冲突 2.1闭散列法 2.11线性探测 2.12二次探测 3代码实现 3.1状态&#xff1a; 3.2创建哈希节点类 3.21哈希表扩容&#xff1a; 3.3数据插入 3.4查找与删除 3.…

数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路

当看到屏幕上一个个炫酷&#xff0c;具有科技感的数据大屏时&#xff0c;很多人都会好奇这是怎么做出来的。自己在制作大屏时明明按着需求做了&#xff0c;可是做出来后总是觉得画面不好看&#xff0c;不够炫&#xff0c;感觉很糟糕。 那要如何才能设计那样的数据可视化大屏呢…

JS 的新一代日期/时间 API Temporal

众所周知&#xff0c;JS的Date是出了名的难用&#xff0c;一直以来我们都在使用momentjs&#xff0c;dayjs等第三方库来处理日期和时间格式&#xff0c;于是 TC39 组织开始了对 Date 的升级改造&#xff0c;他们找到了 moment.js 库的作者&#xff0c;Maggie &#xff0c;由她来…

【深度学习】实验5答案:滴滴出行-交通场景目标检测

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

代码随想录刷题| 01背包理论基础 LeetCode 416. 分割等和子集

目录 01背包理论基础 二维dp数组 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、打印dp数组 最终代码 一维dp数组 1、确定dp数组的定义 2、确定递推公式 3、初始化dp数组 4、遍历顺序 5、打印dp数组 最终代码 416. 分割…

一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition

前言 SpringBoot是Spring的包装&#xff0c;通过自动配置使得SpringBoot可以做到开箱即用&#xff0c;上手成本非常低&#xff0c;但是学习其实现原理的成本大大增加&#xff0c;需要先了解熟悉Spring原理。如果还不清楚Spring原理的&#xff0c;可以先查看博主之前的文章&…

Vue实现简易购物车功能

用Vue写一个列表案例&#xff0c;页面布局什么的dom&#xff0c;不需要自己事先全部排好&#xff0c;而是通过li遍历&#xff0c;把数据遍历出来&#xff1b;先定义好div标签&#xff0c;li根据数组的长度datalist进行遍历&#xff0c;图片的链接要用“&#xff1a;”&#xff…

算法设计与分析 SCAU8597 石子划分问题

8597 石子划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 给定n个石子&#xff0c;其重量分别为a1,a2,a3,…,an。 要求将其划分为m份&#xff0c;每一份的划分费用定义为这份石子中最大重量与最小重量差…

nRF52832闪存FDS使用(SDK17.1.0)

陈拓 2022/10/29-2022/11/22 1. 简介 对于Nordic芯片内部FLASH存储管理有两种方式&#xff0c;FS (Flash Storage)和FDS (Flash Data Storage) 。FS是FDS的底层实现&#xff0c;FDS是对FS的封装&#xff0c;使用更容易。 Flash Data Storage&#xff08;FDS&#xff09;模块是…

容器与容器编排系统

Docker公司发明的「容器镜像」技术&#xff0c;创造性地解决了应用打包的难题。改变了一大批诸如容器编排、服务网格和云原生等技术&#xff0c;深刻影响了云计算领域的技术方向。 一、Docker 容器技术 概括起来&#xff0c;Docker 容器技术有3个核心概念容器、镜像和镜像仓库…

当3A射击游戏遇上Play to Earn,暴躁兔带你了解MetalCore

MetalCore是一款具有机甲风格的战斗射击类的Play to Earn & Free to Play游戏&#xff0c;暴躁兔对这款游戏之前也有做过分析&#xff0c;MetalCore在近期启动了alpha开放世界测试&#xff0c;之前有NFT的玩家获得key code之后可以在PC端下载后进行体验。alpha阶段在10月20…

如何使IOT2050成为PN设备

Profinet Driver&#xff08;PNDriver&#xff09;从V2.3开始支持IO设备(IOD)功能&#xff0c;支持通用网络接口和Linux操作系统&#xff0c;最小支持2ms的通讯周期。本文介绍如何编译PNDriver并运行在IOT2050上。 1. 编译PNDriver 因为PNDriver只支持32位模式&#xff0c;因…

TiDB ——TiKV

TiDB ——TiKV TiKV持久化 TiKV架构和作用TiKV数据持久化和读取TiKV如何提供MVCC和分布式事务支持TiKV基于Raft算法的分布式一致性TiKV的coprocessor TiKV架构和作用 数据持久化分布式一致性MVCC分步式事务Coprocessor RocksDB 单机持久化引擎&#xff0c;单机key-value的…

L2十档行情API接口的开发原理是什么?

L2十档行情API接口的开发原理不知道大家有没有了解过&#xff0c;其实在现实的股市量化交易中&#xff0c;就有不少的投资者也在思考这个问题&#xff0c;并且也有的部分交易者会选择自己开发来使用&#xff0c;不仅支持A股所有的股票数据&#xff0c;也能对期货、外汇、黄金等…

个人项目-部署手册

前言 一、RDS和ECS购买与配置 https://www.aliyun.com/?spm5176.12818093.top-nav.dlogo.3be916d0u0Ncp9 购买RDS(MYSQL)和ECS(规格族&#xff1a;突发性能实例 t6 )的时候尽量选择一个大区》如&#xff1a;华东&#xff08;杭州&#xff09;配置不需要太高(够自己使用就行了…

干货分享 | B站SLO由失败转成功,B站SRE做对了什么?

最近几年&#xff0c;Google SRE在国内非常流行。 Google SRE方法论中提出了SLO是SRE实践的核心&#xff0c;SLO为服务可靠性设定了一个目标级别&#xff0c;它是量化线上质量的关键因素&#xff0c;它是用来回答一个服务到底“什么时候叫做挂了”的根本依据&#xff0c;也是可…

Python网络爬虫入门篇

1. 预备知识 学习者需要预先掌握Python的数字类型、字符串类型、分支、循环、函数、列表类型、字典类型、文件和第三方库使用等概念和编程方法。 2. Python爬虫基本流程 a. 发送请求 使用http库向目标站点发起请求&#xff0c;即发送一个Request&#xff0c;Request包含&am…

xxl-job 执行成功,但是报“任务结果丢失,标记失败“错误

问题1:使用xxl定时更新数据,发现执行结果是失败的 打开日志查看,发现没报错,结果是200 打开备注,上面写着"结果丢失". 再仔细对比下,发现外面日志列表中的执行时间是00:20:18;而日志记录中的最后时间是00:39:32;也就是说线程还没执行完,就先报结果错误了. 对比日志时…

[附源码]Python计算机毕业设计宠物寄养管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…