ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/

更多nbcio-boot功能请看演示系统 

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://122.227.135.243:9888

1、原先vue2代码如下:

<template><div class="panel-tab__content"><el-form size="mini" label-width="90px" @submit.native.prevent><el-form-item label="表单" prop="formKey"><el-select v-model="formKey" v-if = "appType[0].id === 'OA'" placeholder="请选择表单" @change="updateElementFormKey" clearable><el-option v-for="item in formOptions" :key="item.formId" :label="item.formName" :value="`key_${item.formId}`" /></el-select><el-select v-model="formKey" v-if = "appType[0].id === 'ZDYYW'" placeholder="请选择自定义业务表单" @change="updateElementFormKey" clearable><el-option v-for="item in formOptions" :key="item.id" :label="item.businessName" :value="`key_${item.id}`" /></el-select></el-form-item><el-form-item prop="localScope"><span slot="label"><el-tooltip content="若为节点表单,则表单信息仅在此节点可用,默认为全局表单,表单信息在整个流程实例中可用" placement="top-start"><i class="header-icon el-icon-info"></i></el-tooltip><span>节点表单</span></span><el-switch :disabled="type === 'StartEvent'" v-model="localScope" active-text="是" inactive-text="否" @change="updateElementFormScope()" /></el-form-item></el-form><el-dialog :visible.sync="fieldOptionModelVisible" :title="optionModelTitle" width="600px" append-to-body destroy-on-close><el-form :model="fieldOptionForm" size="mini" label-width="96px" @submit.native.prevent><el-form-item label="编号/ID" v-if="fieldOptionType !== 'constraint'" key="option-id"><el-input v-model="fieldOptionForm.id" clearable /></el-form-item><el-form-item label="名称" v-if="fieldOptionType !== 'property'" key="option-name"><el-input v-model="fieldOptionForm.name" clearable /></el-form-item><el-form-item label="配置" v-if="fieldOptionType === 'constraint'" key="option-config"><el-input v-model="fieldOptionForm.config" clearable /></el-form-item><el-form-item label="值" v-if="fieldOptionType === 'property'" key="option-value"><el-input v-model="fieldOptionForm.value" clearable /></el-form-item></el-form><template slot="footer"><el-button size="mini" @click="fieldOptionModelVisible = false">取 消</el-button><el-button size="mini" type="primary" @click="saveFieldOption">确 定</el-button></template></el-dialog></div>
</template><script>
import { listForm } from "@/api/workflow/form";
import { listCustomForm } from "@/api/workflow/customForm";export default {name: "ElementForm",props: {id: String,type: String,appType: {type: Array,default: () => []}},inject: {prefix: "prefix",width: "width"},data() {return {formOptions: [],formKey: "",localScope: false,businessKey: "",optionModelTitle: "",fieldList: [],formFieldForm: {},fieldType: {long: "长整型",string: "字符串",boolean: "布尔类",date: "日期类",enum: "枚举类",custom: "自定义类型"},formFieldIndex: -1, // 编辑中的字段, -1 为新增formFieldOptionIndex: -1, // 编辑中的字段配置项, -1 为新增fieldModelVisible: false,fieldOptionModelVisible: false,fieldOptionForm: {}, // 当前激活的字段配置项数据fieldOptionType: "", // 当前激活的字段配置项弹窗 类型fieldEnumList: [], // 枚举值列表fieldConstraintsList: [], // 约束条件列表fieldPropertiesList: [] // 绑定属性列表};},watch: {id: {immediate: true,handler(val) {val && val.length && this.$nextTick(() => this.resetFormList());}}},created() {/** 查询流程分类列表 */this.getFormList();},methods: {/** 查询表单列表 */getFormList() {if(this.appType[0].id === 'OA' ) {listForm().then(response => {this.formOptions = response.rows;console.log("listForm this.formOptions=",this.formOptions);});}else if(this.appType[0].id === 'ZDYYW') {listCustomForm().then(response => {this.formOptions = response.rows;console.log("listCustomForm this.formOptions=",this.formOptions);});}},resetFormList() {this.bpmnELement = window.bpmnInstances.bpmnElement;this.formKey = this.bpmnELement.businessObject.formKey;this.localScope = this.bpmnELement.businessObject.localScope;// 获取元素扩展属性 或者 创建扩展属性this.elExtensionElements =this.bpmnELement.businessObject.get("extensionElements") || window.bpmnInstances.moddle.create("bpmn:ExtensionElements", { values: [] });// 获取元素表单配置 或者 创建新的表单配置// this.formData =//   this.elExtensionElements.values.filter(ex => ex.$type === `${this.prefix}:FormData`)?.[0] ||//   window.bpmnInstances.moddle.create(`${this.prefix}:FormData`, { fields: [] });// 业务标识 businessKey, 绑定在 formData 中// this.businessKey = this.formData.businessKey;// 保留剩余扩展元素,便于后面更新该元素对应属性this.otherExtensions = this.elExtensionElements.values.filter(ex => ex.$type !== `${this.prefix}:FormData`);// 复制原始值,填充表格// this.fieldList = JSON.parse(JSON.stringify(this.formData.fields || []));// 更新元素扩展属性,避免后续报错// this.updateElementExtensions();},updateElementFormKey() {window.bpmnInstances.modeling.updateProperties(this.bpmnELement, { formKey: this.formKey });if(this.type != 'StartEvent') {this.localScope = true;window.bpmnInstances.modeling.updateProperties(this.bpmnELement, { localScope: this.localScope });}},updateElementFormScope() {window.bpmnInstances.modeling.updateProperties(this.bpmnELement, { localScope: this.localScope });},updateElementBusinessKey() {window.bpmnInstances.modeling.updateModdleProperties(this.bpmnELement, this.formData, { businessKey: this.businessKey });},// 根据类型调整字段typechangeFieldTypeType(type) {this.$set(this.formFieldForm, "type", type === "custom" ? "" : type);},// 打开字段详情侧边栏openFieldForm(field, index) {this.formFieldIndex = index;if (index !== -1) {const FieldObject = this.formData.fields[index];this.formFieldForm = JSON.parse(JSON.stringify(field));// 设置自定义类型this.$set(this.formFieldForm, "typeType", !this.fieldType[field.type] ? "custom" : field.type);// 初始化枚举值列表field.type === "enum" && (this.fieldEnumList = JSON.parse(JSON.stringify(FieldObject?.values || [])));// 初始化约束条件列表this.fieldConstraintsList = JSON.parse(JSON.stringify(FieldObject?.validation?.constraints || []));// 初始化自定义属性列表this.fieldPropertiesList = JSON.parse(JSON.stringify(FieldObject?.properties?.values || []));} else {this.formFieldForm = {};// 初始化枚举值列表this.fieldEnumList = [];// 初始化约束条件列表this.fieldConstraintsList = [];// 初始化自定义属性列表this.fieldPropertiesList = [];}this.fieldModelVisible = true;},// 打开字段 某个 配置项 弹窗openFieldOptionForm(option, index, type) {this.fieldOptionModelVisible = true;this.fieldOptionType = type;this.formFieldOptionIndex = index;if (type === "property") {this.fieldOptionForm = option ? JSON.parse(JSON.stringify(option)) : {};return (this.optionModelTitle = "属性配置");}if (type === "enum") {this.fieldOptionForm = option ? JSON.parse(JSON.stringify(option)) : {};return (this.optionModelTitle = "枚举值配置");}this.fieldOptionForm = option ? JSON.parse(JSON.stringify(option)) : {};return (this.optionModelTitle = "约束条件配置");},// 保存字段 某个 配置项saveFieldOption() {if (this.formFieldOptionIndex === -1) {if (this.fieldOptionType === "property") {this.fieldPropertiesList.push(this.fieldOptionForm);}if (this.fieldOptionType === "constraint") {this.fieldConstraintsList.push(this.fieldOptionForm);}if (this.fieldOptionType === "enum") {this.fieldEnumList.push(this.fieldOptionForm);}} else {this.fieldOptionType === "property" && this.fieldPropertiesList.splice(this.formFieldOptionIndex, 1, this.fieldOptionForm);this.fieldOptionType === "constraint" && this.fieldConstraintsList.splice(this.formFieldOptionIndex, 1, this.fieldOptionForm);this.fieldOptionType === "enum" && this.fieldEnumList.splice(this.formFieldOptionIndex, 1, this.fieldOptionForm);}this.fieldOptionModelVisible = false;this.fieldOptionForm = {};},// 保存字段配置saveField() {const { id, type, label, defaultValue, datePattern } = this.formFieldForm;const Field = window.bpmnInstances.moddle.create(`${this.prefix}:FormField`, { id, type, label });defaultValue && (Field.defaultValue = defaultValue);datePattern && (Field.datePattern = datePattern);// 构建属性if (this.fieldPropertiesList && this.fieldPropertiesList.length) {const fieldPropertyList = this.fieldPropertiesList.map(fp => {return window.bpmnInstances.moddle.create(`${this.prefix}:Property`, { id: fp.id, value: fp.value });});Field.properties = window.bpmnInstances.moddle.create(`${this.prefix}:Properties`, { values: fieldPropertyList });}// 构建校验规则if (this.fieldConstraintsList && this.fieldConstraintsList.length) {const fieldConstraintList = this.fieldConstraintsList.map(fc => {return window.bpmnInstances.moddle.create(`${this.prefix}:Constraint`, { name: fc.name, config: fc.config });});Field.validation = window.bpmnInstances.moddle.create(`${this.prefix}:Validation`, { constraints: fieldConstraintList });}// 构建枚举值if (this.fieldEnumList && this.fieldEnumList.length) {Field.values = this.fieldEnumList.map(fe => {return window.bpmnInstances.moddle.create(`${this.prefix}:Value`, { name: fe.name, id: fe.id });});}// 更新数组 与 表单配置实例if (this.formFieldIndex === -1) {this.fieldList.push(this.formFieldForm);this.formData.fields.push(Field);} else {this.fieldList.splice(this.formFieldIndex, 1, this.formFieldForm);this.formData.fields.splice(this.formFieldIndex, 1, Field);}this.updateElementExtensions();this.fieldModelVisible = false;},// 移除某个 字段的 配置项removeFieldOptionItem(option, index, type) {if (type === "property") {this.fieldPropertiesList.splice(index, 1);return;}if (type === "enum") {this.fieldEnumList.splice(index, 1);return;}this.fieldConstraintsList.splice(index, 1);},// 移除 字段removeField(field, index) {this.fieldList.splice(index, 1);this.formData.fields.splice(index, 1);this.updateElementExtensions();},updateElementExtensions() {// 更新回扩展元素const newElExtensionElements = window.bpmnInstances.moddle.create(`bpmn:ExtensionElements`, {values: this.otherExtensions.concat(this.formData)});// 更新到元素上window.bpmnInstances.modeling.updateProperties(this.bpmnELement, {extensionElements: newElExtensionElements});}}
};
</script>

2、修改成vue3代码如下:

<template><div class="panel-tab__content"><el-form size="mini" label-width="90px" @submit.native.prevent><el-form-item label="表单" prop="formKey"><el-select v-model="formKey" v-if = "appType[0].id === 'OA'" placeholder="请选择表单" @change="updateElementFormKey" clearable><el-option v-for="item in formOptions" :key="item.formId" :label="item.formName" :value="`key_${item.formId}`" /></el-select><el-select v-model="formKey" v-if = "appType[0].id === 'ZDYYW'" placeholder="请选择自定义业务表单" @change="updateElementFormKey" clearable><el-option v-for="item in formOptions" :key="item.id" :label="item.businessName" :value="`key_${item.id}`" /></el-select></el-form-item><el-form-item prop="localScope"><span slot="label"><el-tooltip content="若为节点表单,则表单信息仅在此节点可用,默认为全局表单,表单信息在整个流程实例中可用" placement="top-start"><i class="header-icon el-icon-info"></i></el-tooltip><span>节点表单</span></span><el-switch :disabled="type === 'StartEvent'" v-model="localScope" active-text="是" inactive-text="否" @change="updateElementFormScope()" /></el-form-item></el-form><el-dialog :visible.sync="fieldOptionModelVisible" :title="optionModelTitle" width="600px" append-to-body destroy-on-close><el-form :model="fieldOptionForm" size="mini" label-width="96px" @submit.native.prevent><el-form-item label="编号/ID" v-if="fieldOptionType !== 'constraint'" key="option-id"><el-input v-model="fieldOptionForm.id" clearable /></el-form-item><el-form-item label="名称" v-if="fieldOptionType !== 'property'" key="option-name"><el-input v-model="fieldOptionForm.name" clearable /></el-form-item><el-form-item label="配置" v-if="fieldOptionType === 'constraint'" key="option-config"><el-input v-model="fieldOptionForm.config" clearable /></el-form-item><el-form-item label="值" v-if="fieldOptionType === 'property'" key="option-value"><el-input v-model="fieldOptionForm.value" clearable /></el-form-item></el-form><template slot="footer"><el-button size="mini" @click="fieldOptionModelVisible = false">取 消</el-button><el-button size="mini" type="primary" @click="saveFieldOption">确 定</el-button></template></el-dialog></div>
</template><script lang="ts" setup>import { listForm } from "@/api/workflow/form";import { listCustomForm } from "@/api/workflow/customForm";defineOptions({ name: 'ElementForm' })const props = defineProps({id: String,type: String,appType: {type: Array,default: () => []}})const prefix = inject('prefix')//const width = inject('width')const formOptions = ref<any[]>([])const formKey = ref('')const localScope= ref(false)const businessKey = ref('')const optionModelTitle = ref('')const fieldList = ref<any[]>([])const formFieldForm = ref<any>({})const fieldType = ref({long: '长整型',string: '字符串',boolean: '布尔类',date: '日期类',enum: '枚举类',custom: '自定义类型'})const formFieldIndex = ref(-1) // 编辑中的字段, -1 为新增const formFieldOptionIndex = ref(-1) // 编辑中的字段配置项, -1 为新增const fieldModelVisible = ref(false)const fieldOptionModelVisible = ref(false)const fieldOptionForm = ref<any>({}) // 当前激活的字段配置项数据const fieldOptionType = ref('') // 当前激活的字段配置项弹窗 类型const fieldEnumList = ref<any[]>([]) // 枚举值列表const fieldConstraintsList = ref<any[]>([]) // 约束条件列表const fieldPropertiesList = ref<any[]>([]) // 绑定属性列表const bpmnELement = ref()const elExtensionElements = ref()const formData = ref()const otherExtensions = ref()watch(() => props.id,(val) => {val &&val.length &&nextTick(() => {resetFormList()})},{ immediate: true })/** 查询表单列表 */const getFormList = () => {console.log("getFormList appType",props.appType);const appType = toRaw(props.appType);console.log("getFormList appType",appType);if(appType && appType[0].id === 'OA' ) {listForm().then(response => {formOptions.value = response.rows;console.log("listForm formOptions=",formOptions);});}else if(appType && appType[0].id === 'ZDYYW') {listCustomForm().then(response => {formOptions.value = response.rows;console.log("listCustomForm formOptions=",formOptions);});}}const bpmnInstances = () => (window as any)?.bpmnInstancesconst resetFormList = () => {bpmnELement.value = bpmnInstances().bpmnElementformKey.value = bpmnELement.value.businessObject.formKeylocalScope.value = bpmnELement.value.businessObject.localScope;// 获取元素扩展属性 或者 创建扩展属性elExtensionElements.value =bpmnELement.value.businessObject.get('extensionElements') ||bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })// 获取元素表单配置 或者 创建新的表单配置formData.value =elExtensionElements.value.values.filter((ex) => ex.$type === `${prefix}:FormData`)?.[0] ||bpmnInstances().moddle.create(`${prefix}:FormData`, { fields: [] })// 业务标识 businessKey, 绑定在 formData 中businessKey.value = formData.value.businessKey// 保留剩余扩展元素,便于后面更新该元素对应属性otherExtensions.value = elExtensionElements.value.values.filter((ex) => ex.$type !== `${prefix}:FormData`)// 复制原始值,填充表格fieldList.value = JSON.parse(JSON.stringify(formData.value.fields || []))// 更新元素扩展属性,避免后续报错updateElementExtensions()}const updateElementFormKey = () => {bpmnInstances().modeling.updateProperties(toRaw(bpmnELement.value), {formKey: formKey.value})if(this.type != 'StartEvent') {this.localScope = true;bpmnInstances().modeling.updateProperties(this.bpmnELement, { localScope: this.localScope });}}const updateElementFormScope = () => {bpmnInstances().modeling.updateModdleProperties(this.bpmnELement, { localScope: this.localScope });}const updateElementBusinessKey = () => {bpmnInstances().modeling.updateModdleProperties(toRaw(bpmnELement.value), formData.value, {businessKey: businessKey.value})}// 根据类型调整字段typeconst changeFieldTypeType = (type) => {// this.$set(this.formFieldForm, "type", type === "custom" ? "" : type);formFieldForm.value['type'] = type === 'custom' ? '' : type}// 打开字段详情侧边栏const openFieldForm = (field, index) => {formFieldIndex.value = indexif (index !== -1) {const FieldObject = formData.value.fields[index]formFieldForm.value = JSON.parse(JSON.stringify(field))// 设置自定义类型// this.$set(this.formFieldForm, "typeType", !this.fieldType[field.type] ? "custom" : field.type);formFieldForm.value['typeType'] = !fieldType.value[field.type] ? 'custom' : field.type// 初始化枚举值列表field.type === 'enum' &&(fieldEnumList.value = JSON.parse(JSON.stringify(FieldObject?.values || [])))// 初始化约束条件列表fieldConstraintsList.value = JSON.parse(JSON.stringify(FieldObject?.validation?.constraints || []))// 初始化自定义属性列表fieldPropertiesList.value = JSON.parse(JSON.stringify(FieldObject?.properties?.values || []))} else {formFieldForm.value = {}// 初始化枚举值列表fieldEnumList.value = []// 初始化约束条件列表fieldConstraintsList.value = []// 初始化自定义属性列表fieldPropertiesList.value = []}fieldModelVisible.value = true}// 打开字段 某个 配置项 弹窗const openFieldOptionForm = (option, index, type) => {fieldOptionModelVisible.value = truefieldOptionType.value = typeformFieldOptionIndex.value = indexif (type === 'property') {fieldOptionForm.value = option ? JSON.parse(JSON.stringify(option)) : {}return (optionModelTitle.value = '属性配置')}if (type === 'enum') {fieldOptionForm.value = option ? JSON.parse(JSON.stringify(option)) : {}return (optionModelTitle.value = '枚举值配置')}fieldOptionForm.value = option ? JSON.parse(JSON.stringify(option)) : {}return (optionModelTitle.value = '约束条件配置')}// 保存字段 某个 配置项const saveFieldOption = () => {if (formFieldOptionIndex.value === -1) {if (fieldOptionType.value === 'property') {fieldPropertiesList.value.push(fieldOptionForm.value)}if (fieldOptionType.value === 'constraint') {fieldConstraintsList.value.push(fieldOptionForm.value)}if (fieldOptionType.value === 'enum') {fieldEnumList.value.push(fieldOptionForm.value)}} else {fieldOptionType.value === 'property' &&fieldPropertiesList.value.splice(formFieldOptionIndex.value, 1, fieldOptionForm.value)fieldOptionType.value === 'constraint' &&fieldConstraintsList.value.splice(formFieldOptionIndex.value, 1, fieldOptionForm.value)fieldOptionType.value === 'enum' &&fieldEnumList.value.splice(formFieldOptionIndex.value, 1, fieldOptionForm.value)}fieldOptionModelVisible.value = falsefieldOptionForm.value = {}}// 保存字段配置const saveField = () => {const { id, type, label, defaultValue, datePattern } = formFieldForm.valueconst Field = bpmnInstances().moddle.create(`${prefix}:FormField`, { id, type, label })defaultValue && (Field.defaultValue = defaultValue)datePattern && (Field.datePattern = datePattern)// 构建属性if (fieldPropertiesList.value && fieldPropertiesList.value.length) {const fieldPropertyList = fieldPropertiesList.value.map((fp) => {return bpmnInstances().moddle.create(`${prefix}:Property`, {id: fp.id,value: fp.value})})Field.properties = bpmnInstances().moddle.create(`${prefix}:Properties`, {values: fieldPropertyList})}// 构建校验规则if (fieldConstraintsList.value && fieldConstraintsList.value.length) {const fieldConstraintList = fieldConstraintsList.value.map((fc) => {return bpmnInstances().moddle.create(`${prefix}:Constraint`, {name: fc.name,config: fc.config})})Field.validation = bpmnInstances().moddle.create(`${prefix}:Validation`, {constraints: fieldConstraintList})}// 构建枚举值if (fieldEnumList.value && fieldEnumList.value.length) {Field.values = fieldEnumList.value.map((fe) => {return bpmnInstances().moddle.create(`${prefix}:Value`, { name: fe.name, id: fe.id })})}// 更新数组 与 表单配置实例if (formFieldIndex.value === -1) {fieldList.value.push(formFieldForm.value)formData.value.fields.push(Field)} else {fieldList.value.splice(formFieldIndex.value, 1, formFieldForm.value)formData.value.fields.splice(formFieldIndex.value, 1, Field)}updateElementExtensions()fieldModelVisible.value = false}// 移除某个 字段的 配置项const removeFieldOptionItem = (option, index, type) => {console.log(option, 'option')if (type === 'property') {fieldPropertiesList.value.splice(index, 1)return}if (type === 'enum') {fieldEnumList.value.splice(index, 1)return}fieldConstraintsList.value.splice(index, 1)}// 移除 字段const removeField = (field, index) => {fieldList.value.splice(index, 1)formData.value.fields.splice(index, 1)updateElementExtensions()}const updateElementExtensions = () => {// 更新回扩展元素const newElExtensionElements = bpmnInstances().moddle.create(`bpmn:ExtensionElements`, {values: otherExtensions.value.concat(formData.value)})// 更新到元素上bpmnInstances().modeling.updateProperties(toRaw(bpmnELement.value), {extensionElements: newElExtensionElements})}onMounted(() => {/** 查询流程分类列表 */getFormList();})</script>

3、效果图如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

蓝桥杯刷题(十三)

1.煤球数目 代码 cnt ans 0 start 1 a [] while cnt<100:ansstartstart 1t ansstartcnt1a.append(ans) print(sum(a))2.奖券数目 代码 def f(x)->bool:while x:if x%104:return Falsex//10return True ans 0 for i in range(10000,100000):if f(i):ans1 print(a…

二叉搜索树(二叉排序树)(含力扣相关题及题解)

文章目录 二叉搜索树&#xff08;二叉排序树&#xff09;1、二叉搜索树概念2、二叉搜索树的操作2.1、二叉搜索树的查找2.2、二叉搜索树的插入2.2、二叉树的删除 3、二叉搜索树的实现&#xff08;含递归版本&#xff09;4、二叉搜索树的应用4.1、K模型4.2、KV模型 5、二叉搜索树…

C语言例:设 int x; 则表达式 (x=4*5,x*5),x+25 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int x,m;m ((x4*5,x*5),x25);printf("(x4*5,x*5),x25 %d\n",m);//x4*520//x*5100//x2545return 0; } 结果如下&#xff1a;

拌合楼管理系统开发(十) 不谈技术只谈管理之大宗物资虚假贸易

前言:不谈技术只谈管理 大宗物资往往都是虚假贸易的重灾区,多年前规模就是面子的口号下,一大批国央企挖空心思做大规模,开展了一大批虚假贸易,同时为了面上的合规性,往往会有三方甚至更多方进入到整个链条中,钱货在这个链条中流转,甚至有些就是钱在流转,如果整个链条有一个环节…

电视盒子哪款好?数码小编分享电视盒子品牌排行榜

电视盒子是我们使用最多的数码产品自已&#xff0c;在挑选电视盒子这块超多朋友踩过雷&#xff0c;广告多&#xff0c;频繁卡顿&#xff0c;收费节目多&#xff0c;究竟电视盒子哪款好&#xff1f;本期小编要分享的就是目前最值得入手的电视盒子品牌排行榜&#xff0c;想买电视…

数据结构中单向链表(无头)的学习

一.数据结构 1.定义 一组用来保存一种或者多种特定关系的数据的集合&#xff08;组织和存储数据&#xff09; 程序的设计&#xff1a;将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中&#xff0c; 并在此基础上实现某个特定的功能的操…

SpringBoot-03 | SpringBoot自动配置

SpringBoot-03 | SpringBoot自动配置 原理分析代码示例源码剖析SpringBootConfiguration&#xff1a;组合注解&#xff0c;标记当前类为配置类ComponentScanEnableAutoConfigurationImport加载spring.factoriesrun初始化加载spring.factoriesspring.factories中的钩子类 网上盗…

58、服务攻防——应用协议设备KibanaZabbix远控向日葵VNCTeamViwer

文章目录 vnc默认端口&#xff1a;5900 or 5902&#xff0c;hydra支持vnc破解。VNC有三种模式&#xff1a;使用vnc密码、windows密码、无密码。 teamviewer、向日葵都是使用之前爆过漏洞进行测试。 zabbix&#xff1a;监控系统&#xff0c;蓝队部署平台。zabbix页面如下&#…

四川宏博蓬达法律咨询有限公司守护您的法律安全

在法治社会中&#xff0c;法律咨询服务的需求日益增长&#xff0c;而四川宏博蓬达法律咨询有限公司正是这一领域中一颗璀璨的明星。公司以其专业的法律服务和严谨的工作态度&#xff0c;为广大客户提供了安全、高效、全面的法律支持&#xff0c;赢得了社会各界的广泛赞誉。 一、…

高德地图——轨迹回放和电子围栏

功能点 地图的初始化显示电子围栏&#xff08;先初始化在调接口显示电子围栏&#xff09;显示定位显示轨迹轨迹回放 &#xff08;回放速度无法控制是因为高德地图的版本问题&#xff0c;不要设置版本&#xff0c;使用默认的即可生效&#xff09;获取当前城市及天气情况设置地图…

【小白成长记】new Error()传递对象数据

new Error()需要传递对象数据时遇到的小问题&#xff0c;简单记录如下。 如下图代码&#xff1a;单个Promise里&#xff0c;表单校验未通过处理为 reject&#xff0c;同时需要将 表单以及未校验通过的错误信息传递以便后续进行处理。经过测试&#xff0c;发现reject只能传递一…

电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll

电脑文件msvcp100.dll丢失原因&#xff0c;最近有朋友在问这个&#xff0c;显然会问这个的人&#xff0c;一般都是遇到了msvcp100.dll丢失的问题了&#xff0c;今天我们就来详细的给大家说说msvcp100.dll这个文件吧&#xff0c;我们只有了解了msvcp100.dll这个文件&#xff0c;…

Docker专题-03 Log-Driver日志转存

Docker专题教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-19 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 说明 容器…

MySQL 索引:索引为什么使用 B+树?

Hash 索引不支持顺序和范围查询&#xff1b; 二叉查找树(BST)&#xff1a;解决了排序的问题&#xff0c;极端情况下可能会退化成线性链表&#xff0c;查询效率急剧下降&#xff1b; 平衡二叉树(AVL) &#xff1a;通过旋转解决了平衡的问题&#xff0c;但是旋转操作效率太低&am…

Rust之构建命令行程序(五):环境变量

开发环境 Windows 11Rust 1.77.0 VS Code 1.87.2 项目工程 这次创建了新的工程minigrep. 使用环境变量 我们将通过添加一个额外的功能来改进minigrep:一个不区分大小写的搜索选项&#xff0c;用户可以通过环境变量打开该选项。我们可以将此功能设置为命令行选项&#xff0c;…

linux 升级openssl1.1.1w 亲测记录

下载好openssl源码包,解压到指定目录下 tar -xzvf openssl-1.1.1w.tar.gz -C /usr/localcd openssl-1.1.1w/*预编译、编译、安装*/./config --prefix/usr/local/openssl sharedmake && make install备份配置系统中原有的文件、创建软链接、动态库查找路径配置文件 ld.s…

SpringBoot实战(二十七)集成WebFlux

目录 一、WebFlux1.1 定义1.2 WebFlux 与 Spring MVC 区别 二、代码实现2.1 Maven 配置2.2 暴露 RESTful API 接口的方式方式一&#xff1a;基于注解的控制器方式二&#xff1a;函数式路由器&#xff08;Functional Endpoints&#xff09; 2.3 测试Service2.4 测试ServiceImpl2…

【Charles如何对手机APP进行抓包和弱网测试】

一、Charles对APP抓包 1、前提条件&#xff1a; 1&#xff09;电脑上必须安装Charles工具&#xff0c;如没有安装可参考&#xff1a;【Charles抓包工具下载安装详细操作步骤】-CSDN博客 2&#xff09;手机和电脑必须在同一个局域网内&#xff08;连接同一个WiFi&#xff09;…

ng发布静态资源 发布项目 发布数据

描述&#xff1a;把一个项目或者数据发布出来&#xff0c;通过http的形式访问&#xff0c;比如发布一个js文件&#xff0c;用http://localhost:6060/data/jquery/jquery.min.js访问。 步骤&#xff1a;配置nginx.conf文件&#xff0c;nginx.conf位于conf目录下&#xff0c;在se…