当前位置: 首页 > news >正文

网站建设的公/百度官方网址

网站建设的公,百度官方网址,世界经理人网站手机版,怎么自己做网站免费的看如下图所示的功能,是不是可高级了?什么,你没看懂?拜托双击放大看! 是的,我最近消失了一段时间就是在研究这个玩意的实现,通过不懈努力与钻研并参考其他人员实现并加以改造,很好&am…

看如下图所示的功能,是不是可高级了?什么,你没看懂?拜托双击放大看!

 是的,我最近消失了一段时间就是在研究这个玩意的实现,通过不懈努力与钻研并参考其他人员实现并加以改造,很好,终于有点小成果,这不就迫不及待给大家分享出来!使用的第三组件为VANT-X6引擎!

自己看官方文档:->https://x6.antv.antgroup.com/tutorial/getting-started

通过上述流后,可以任意组装出查询SQL语句或者是结构交给后端进行查询显示!这远比给定的那些搜索框框来的更加有性价比!用户搜索功能那就是嗖的一下提升了好多个档次。

来吧,到了最重要的环节,代码展示:

一、依赖安装

在项目的依赖包中添加以下依赖:最好按照我使用的版本添加哦,避免出现不兼容API报错无法运行!

"@antv/x6": "1.34.6",
"@antv/hierarchy": "0.6.8",
"@antv/x6-vue-shape": "1.3.2",
"@vue/composition-api":"1.3.0"

完成后,进行npm install或yarn install,取决于你使用的是什么环境脚本!

二、页面代码:

 queryGraph.vue 页面代码

<template><div id="container" style="height: 100%;width:100%"></div>
</template>
<script>
import { Graph } from '@antv/x6'
import Hierarchy from '@antv/hierarchy'
import '@antv/x6-vue-shape'
import condition from './queryCondition.vue' //这是我的vue组件,作为子节点展示在思维导图上
import { findItem, lastChild, setData, addChildNode, removeNode, randomId } from './fun'export default {data() {return {graphData: {'id': '1','type': 'original—add','width': 80,'height': 30,"children": [// {//     "id": 0.28207584597793156,//     "type": "relative", //关系节点//     "width": 44,//     "height": 44,//     "data": {//         "relative": "and" //and并且 or或者//     },//     "children": [//         {//             "id": 0.32858917851150116,//             "type": "condition-text", //条件节点//             "width": 90,//             "height": 44,//             "level": 1, //判断它是第几级的条件节点//             "edgeText": "",//             "data": {//                 "complete": true,//                 "form": {} //你的业务数据//             }//         },//         {//             "id": 0.30546487070416783,//             "type": "vue-shape", //自定义组件 业务节点//             "width": 744,//             "height": 44,//             "level": 1,//             "edgeText": "",//             "data": {//                 "complete": false,//                 "form": {} //你的业务数据//             }//         }//     ]// }]} //默认只有一个根节点}},mounted() {this.init()},methods: {//初始化⽅法init() {let self = thisGraph.registerNode('original—add',{inherit: 'rect',width: 80,height: 30,label: '+纳入条件',attrs: { //样式代码body: {rx: 4,ry: 4,stroke: '#037AFB',fill: '#037AFB',strokeWidth: 1,event: 'add:original' //根节点点击事件},label: {fontSize: 14,fill: 'white',event: 'add:original'//根节点点击事件}}},true,)//表示《并且 或者》的关系节点Graph.registerNode('relative',{inherit: 'rect',markup: [{tagName: 'rect',selector: 'body'},{tagName: 'text',selector: 'label_text'},{tagName: 'image',selector: 'switch'}],attrs: { //样式代码body: {rx: 4,ry: 4,stroke: 'orange',fill: 'orange',strokeWidth: 1,event: 'change:relative'},label_text: {fontSize: 14,fill: 'white',event: 'change:relative'},switch: {event: 'change:relative' //关系节点 切换 关系事件},text: { text: '并且' }},data: { relative: 'and' } //and并且 or或者 默认为 并且})//自定义vue 业务节点Graph.registerVueComponent('condition', condition, true)//显示条件语句Graph.registerNode('condition-text',{inherit: 'rect',markup: [{tagName: 'rect',selector: 'body'},{tagName: 'g',attrs: { class: 'content' },children: []}],attrs: {}//样式代码})// 弯的边Graph.registerEdge('mindmap-edge',{inherit: 'edge',router: {name: 'manhattan',args: {startDirections: ['right'],endDirections: ['left']}},connector: {name: 'rounded'},attrs: {line: {targetMarker: '',stroke: '#A2B1C3',strokeWidth: 2}}, //样式代码zIndex: 0},true,)// 直的边Graph.registerEdge('straight-edge',{inherit: 'edge',attrs: {}, //样式代码zIndex: 0},true,)//编辑Graph.registerNodeTool('edit', {inherit: 'button', // 基类名称,使用已经注册的工具名称。markup: [{tagName: 'rect',selector: 'button',attrs: {fill: '#296FFF',cursor: 'pointer',width: 32,height: 28}},{tagName: 'image',selector: 'icon',attrs: {'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',cursor: 'pointer',width: 16,height: 16,x: 8,y: 6}}],x: '100%',y: '100%',offset: { x: -96, y: -72 },onClick({ cell }) {const dataItem = cell.getData()setData(this.graphData, cell.id, { ...dataItem, complete: false, isEdit: true })cell.setData({ ...dataItem, complete: false, isEdit: true })//打开编辑时,子级元素偏移const firstChild = cell.getChildAt(0)if (firstChild) {const cellWidth = dataItem.form.unit ? 844 : 744const x = cellWidth - firstChild.position({ relative: true }).x + 80 //编辑框 - 第一个子级位置 - 连接线宽 = 子级偏移量cell.getChildAt(0).translate(x)}}})//删除Graph.registerNodeTool('del', {inherit: 'button', // 基类名称,使用已经注册的工具名称。markup: [{tagName: 'rect',selector: 'button',attrs: {fill: '#296FFF',cursor: 'pointer',width: 32,height: 28}},{tagName: 'image',selector: 'icon',attrs: {'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',cursor: 'pointer',width: 16,height: 16,x: 8,y: 6}}],x: '100%',y: '100%',offset: { x: -64, y: -72 },onClick({ cell }) {if (removeNode(cell.id, this.graphData)) {render(graph, this.graphData)}}})//新增限定条件Graph.registerNodeTool('add-condition', {inherit: 'button', // 基类名称,使用已经注册的工具名称。markup: [{tagName: 'rect',selector: 'button',attrs: {fill: '#296FFF',cursor: 'pointer',width: 32,height: 28}},{tagName: 'image',selector: 'icon',attrs: {'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',cursor: 'pointer',width: 16,height: 16,x: 8,y: 6}}],x: '100%',y: '100%',offset: { x: -32, y: -72 },onClick({ cell }) {debuggerconst { id } = cellconst dataItem = findItem(this.graphData, id).nodeconst lastNode = lastChild(dataItem)//找到当前node的最后一级,添加if (addChildNode(lastNode.id, '并且', graphData)) render(graph, this.graphData)}})//关系节点 点击增加条件事件Graph.registerNodeTool('relative:add-condition', {inherit: 'button', // 基类名称,使用已经注册的工具名称。markup: [{tagName: 'rect',selector: 'button',attrs: {fill: '#296FFF',cursor: 'pointer',width: 32,height: 28}},{tagName: 'image',selector: 'icon',attrs: {'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',cursor: 'pointer',width: 16,height: 16,x: 8,y: 6}}],x: '100%',y: '100%',offset: { x: -32, y: -72 },onClick({ cell }) {debuggerconst { id } = cellif (addChildNode(id, '', this.graphData)) render(graph, this.graphData)}})//边增加条件Graph.registerEdgeTool('edge:add-condition', {inherit: 'button', // 基类名称,使用已经注册的工具名称。markup: [{tagName: 'rect',selector: 'button',attrs: {fill: '#296FFF',cursor: 'pointer',fontSize: 16,width: 20,height: 20,rx: 2,ry: 2,stroke: '#296FFF',strokeWidth: 1}},{tagName: 'text',selector: 'label',textContent: '+',attrs: {x: 5,y: 15,fontSize: 16,cursor: 'pointer',fill: '#ffff'}}],distance: '100%',offset: { y: -10, x: -10 },onClick({ cell }) {const { node, parent } = findItem(self.graphData, cell.target.cell)const newId = randomId()const childP = {children: [node],id: newId,type: 'relative',width: 40,height: 40,level: 2,data: { relative: 'and', type: 'document' }}const currentIndex = parent.children.findIndex(item => item.id === node.id)parent.children[currentIndex] = childPlet anode = addChildNode(newId, '', self.graphData)anode.width = 550if (anode) {render(graph, self.graphData)}// const { node, parent } = findItem(self.graphData, cell.target.cell)// const newId = randomId()// const childP = {//     id: newId,//     type: "vue-shape", //自定义组件 业务节点//     width: 550,//     height: 44,//     level: 1,//     edgeText: "",//     data: {//         complete: false,//         form: {} //你的业务数据//     }// }// parent.children.push(childP)// render(graph, self.graphData)}})let graph = new Graph({background: { color: '#fff' },container: document.getElementById('container'),panning: { enabled: true },selecting: { enabled: true },keyboard: { enabled: true },grid: true,mousewheel: {enabled: true,modifiers: ['ctrl', 'meta']},interacting: { nodeMovable: false }})const render = (graph, graphData) => {const result = Hierarchy.mindmap(graphData, {direction: 'H',getHeight(d) {return d.height},getWidth(d) {return d.width},getHGap() {return 40},getVGap() {return 20},getSide: () => {return 'right'}})const cells = []const traverse = (hierarchyItem, parentId) => {if (hierarchyItem) {const { data, children } = hierarchyItemconst node = graph.createNode({...data,shape: data.type,x: hierarchyItem.x,y: hierarchyItem.y,component: 'condition'})if (parentId) {//有父级则插入父级const parent = graph.getCellById(parentId)parent && parent.addChild(node)}if (data.type === 'condition-text') {//条件文案节点 根据文字长度,计算宽度,这边粗糙了点,将数字也按中文字长度计算,可优化//下面是我的根据我的业务数据结构计算长度,可参考//const { key, opt, value = [], unit } = data.data.form//const keyText = key.displayText//const optText = opt.displayText//const valueText = typeof value === 'string' ? value : value.join(',')//const unitText = valueText.length ? (unit || '') : ''//const width = (keyText.length + optText.length + valueText.length + unitText.length) * 16 + 10//node.attr('key/text', `${keyText},`)//node.attr('opt', { text: `${optText} `, x: keyText.length * 16 + 5 })//node.attr('value', { text: valueText, x: (keyText.length + optText.length) * 16 + 5 })//node.attr('unit', { text: unitText, x: (keyText.length + optText.length + valueText.length) * 16 + 5 })//node.resize(width, 44)//data.width = width}//关系节点,默认是并且为蓝色,是或者的话,需要切换颜色判断if (data.type === 'relative' && data.data.relative === 'or') {node.setAttrs({body: { stroke: '#CEE8D9', fill: '#CEE8D9' },label_text: { fill: '#008451' },switch: { 'xlink:href': "" },text: { text: '或者' }})}cells.push(node)//子节点边if (children) {children.forEach((item) => {const { id, data: itemData } = itemcells.push(graph.createEdge({shape: itemData.edgeText ? 'straight-edge' : 'mindmap-edge',source: {cell: hierarchyItem.id,anchor: {name: itemData.type === 'topic-child' ? 'right' : 'center',args: {dx: itemData.type === 'topic-child' ? -16 : '25%'}}},target: { cell: id, anchor: { name: 'left' } },labels: [{ attrs: { text: { text: itemData.edgeText || '' } } }]}),)traverse(item, node.id)})}}}traverse(result)graph.resetCells(cells)// graph.scaleContentToFit({ maxScale: 1 })graph.centerContent()}//根结点添加graph.on('add:original', ({ node }) => {debuggerif (this.graphData.children.length == 0) {const { id } = nodelet anode = addChildNode(id, '', this.graphData)anode.id = randomId()anode.type = "vue-shape" //自定义组件 业务节点anode.width = 550anode.height = 44anode.level = 1anode.edgeText = ""anode.data = {complete: false,form: {} //你的业务数据}anode.children = []if (anode) {render(graph, this.graphData)}}else if (this.graphData.children.lastObject().type != 'relative') {const { id } = nodelet tlist = this.graphData.childrenthis.graphData.children = []let anode = addChildNode(id, '', this.graphData)anode.type = "relative"anode.width = 40;anode.height = 40;anode.level = 1;anode.data = {"relative": "and" //and并且 or或者}let xlist = []tlist.forEach(element => {xlist.push(element)});xlist.push({"id": randomId(),"type": "vue-shape", //自定义组件 业务节点"width": 550,"height": 44,"level": 1,"edgeText": "","data": {"complete": false,"form": {} //你的业务数据}})anode.children = xlistif (anode) {render(graph, this.graphData)}}else {const { id } = nodelet tlist = this.graphData.childrenthis.graphData.children = []let anode = addChildNode(id, '', this.graphData)anode.type = "relative"anode.width = 40;anode.height = 40;anode.level = 1;anode.data = {"relative": "and" //and并且 or或者}let xlist = []tlist.forEach(x=>{xlist.push(x)})xlist.push({"id": randomId(),"type": "vue-shape", //自定义组件 业务节点"width": 550,"height": 44,"level": 1,"edgeText": "","data": {"complete": false,"form": {} //你的业务数据}})anode.children = xlist// tlist.push(anode)this.graphData.children = [anode]if (anode) {render(graph, this.graphData)}}})//节点数据变化graph.on('node:change:data', (cell) => {debugger})//关系节点 切换《并且或者》graph.on('change:relative', (cell) => {let node = cell.nodeif (node.data.relative == "and") {node.data.relative = "or"node.setAttrs({body: {stroke: '#d4eade',fill: '#d4eade'},label_text: {fontSize: 14,fill: '#3e845e',},text: { text: '或者' }})}else {node.data.relative = "and"node.setAttrs({body: {stroke: 'orange',fill: 'orange'},label_text: {fontSize: 14,fill: 'white',},text: { text: '并且' }})}debuggerconst dataItem = node.getData()setData(self.graphData,node.id,dataItem)debugger})//节点聚焦 增加工具栏目graph.on('node:mouseenter', ({ node }) => {// if (['condition-text', 'relative'].includes(node.shape)) {//     if (!this.isExistUnComplete()) { //判断当前是否有未填写完成的vue组件节点//         if (node.shape === 'condition-text') {//             node.setAttrs({ body: { fill: '#E9F0FF', stroke: '#296FFF' } })//         }//         this.addTool(node)//     }// }})//节点失焦 移除工具栏graph.on('node:mouseleave', ({ node }) => {// if (['condition-text', 'relative'].includes(node.shape)) {//     if (node.shape === 'condition-text') {//         node.setAttrs({ body: { stroke: '#CCC', fill: '#fff' } })//     }//     this.removeTool(node)// }})//边 悬浮事件graph.on('edge:mouseenter', ({ edge }) => {//不是 根结点下第一个关系节点 并且 没有未完成的节点 可添加const targetNode = graph.getCellById(edge.target.cell)const targetNodeData = findItem(this.graphData, edge.target.cell).nodeconst isChild = targetNodeData.level ? targetNodeData.level === 1 : true //不是限定节点 可添加if (!(edge.source.cell === '1' && targetNode.shape === 'relative') && isChild && !this.isExistUnComplete()) {edge.addTools(['edge:add-condition'])}})//边 失焦graph.on('edge:mouseleave', ({ edge }) => {if (!this.isExistUnComplete()) {//判断当前是否有未填写完成的vue组件节点edge.removeTools(['edge:add-condition'])}})render(graph, this.graphData)},isExistUnComplete() {return false}}
}
</script>
<style lang="scss">
.topic-image {visibility: hidden;cursor: pointer;
}.x6-node:hover .topic-image {visibility: visible;
}.x6-node-selected rect {stroke-width: 2px;
}
</style>

三、自定义条件组件queryCondition.vue

<template><div class="condition"><el-form ref="form" :model="form" label-width="0" inline><el-row :gutter="10"><el-col :span=8><el-form-item class="w-100"><el-input v-model="form.name" placeholder="搜索项目"></el-input></el-form-item></el-col><el-col :span=4><el-form-item class="w-100"><el-select v-model="form.condition" placeholder="关系"><el-option v-for="item in optionsList" :key="item.label" :label="item.label":value="item.value"></el-option></el-select></el-form-item></el-col><el-col :span=7><el-form-item class="w-100"><el-input v-model="form.text" placeholder="对比值"></el-input></el-form-item></el-col><el-col :span=5><el-from-item class="w-100"><div class="flex-row w-100"><el-button>取消</el-button><el-button type="primary" @click="onSubmit">确定</el-button></div></el-from-item></el-col></el-row></el-form></div>
</template><script>// import { elForm, elFormItem, elInput, elSelect, elOption } from 'element-ui'//在这需要再次按需引入对应组件
export default {name: 'queryCondition',inject: ["getGraph", "getNode"],// components: { elForm, elFormItem, elInput, elSelect, elOption },data() {return {form: {name:null,condition:null,text:null},optionsList: [{ label: '等于', value: '=' },{ label: '不等于', value: '!=' },{ label: '大于', value: '>' },{ label: '大于等于', value: '>=' },{ label: '小于', value: '<' },{ label: '小于等于', value: '<=' }]}},mounted() {},methods: {onSubmit(){}}
}
</script><style lang="scss" scoped>
.condition {padding: 0px 10px;height: 100%;background: #EFF4FF;border: 1px solid #5F95FF;border-radius: 6px;display: flex;flex-direction: row;justify-content: center;align-items: center;
}.flex-row{display: flex;flex-direction: row;justify-content: center;align-items: center;
}::v-deep {.el-form-item--small {margin: 0px;vertical-align: middle !important;}.el-button--small{padding-left:10px;padding-right: 10px;}
}
</style>

四、公共方法 fun.js

import {snowFlakeId} from '@/utils/snowFlake'//查找节点的父节点 当前节点,顶级节点的数据
export const findItem = (obj, id, levelTop) => {const topNode = levelTop? levelTop: obj.level && obj.level === 1? obj: null;if (obj.id === id) {return {parent: null,node: obj,topNode,};}const { children } = obj;if (children) {for (let i = 0, len = children.length; i < len; i++) {const res = findItem(children[i], id, topNode);if (res) {return {parent: res.parent || obj,node: res.node,topNode: res.topNode,};}}}return null;
};
//查找最末级
export const lastChild = (obj) => {if (obj.children && obj.children.length) {return lastChild(obj.children[0]);} else {return obj;}
};
//设置某个节点的data
export const setData = (obj, id, dataItem) => {if (obj.id === id) {obj.data = dataItem;if (["vue-shape", "condition-text"].includes(obj.type)) {obj.type = dataItem.complete ? "condition-text" : "vue-shape";}return;}if (obj.children) {obj.children.forEach((child) => {setData(child, id, dataItem);});}
};//插入节点
export const addChildNode = (id, edgeText, data) => {const res = findItem(data, id);const dataItem = res.node;if (dataItem) {const item = {id: randomId(),type: "vue-shape",width: 744,height: 44, //内容宽高 + padding20 + 边框4level: dataItem.level === 1 ? dataItem.level + 1 : 1,edgeText,};if (dataItem.children) {dataItem.children.push(item);} else {dataItem.children = [item];}return item;}return null;
};
//移除节点
export const removeNode = (id, data) => {const res = findItem(data, id);const dataItem = res.parent;if (dataItem && dataItem.children) {const { children } = dataItem;const index = children.findIndex((item) => item.id === id);children.splice(index, 1); //删除当前if (children.length && children.length < 2) {//并且或者 只有一个子级时 删除并且或者节点const p2 = findItem(data, dataItem.id).parent; //父级的父级const p2OtherChildren = p2.children.filter((item) => item.id !== dataItem.id);p2.children = [...p2OtherChildren, ...children];}return true;}return null;
};export const randomId = ()=> {return snowFlakeId()
};

目前只实现初步的效果,后期实现相关功能后再视具体是否可开放源码进行共享!

创作不易,谢谢你的点赞和关注收藏!

相关文章:

VUE条件树查询

看如下图所示的功能&#xff0c;是不是可高级了&#xff1f;什么&#xff0c;你没看懂&#xff1f;拜托双击放大看&#xff01; 是的&#xff0c;我最近消失了一段时间就是在研究这个玩意的实现&#xff0c;通过不懈努力与钻研并参考其他人员实现并加以改造&#xff0c;很好&am…...

vue框架学习 -- 日历控件 FullCalendar 使用总结

最近在项目中要实现日期排班的功能&#xff0c;正好要用到日历视图的控件&#xff0c;经过对比发现&#xff0c;vue 中 使用 FullCalendar 可以实现相关需求&#xff0c;下面对使用过程做一个总结。 一. 引入 FullCalendar 控件 package.json 中添加相关依赖 "dependen…...

[数据集][目标检测]猪数据集VOC-2856张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;2856 标注数量(xml文件个数)&#xff1a;2856 标注类别数&#xff1a;1 标注类别名称:["pig"] 每个类别标注的框数&#xff1a…...

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中&#xff0c;设备管理涵盖多个关键方面&#xff0c;对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术&#xff0c;获取设备…...

OpenCV图像文件读写(3)统计多页图像文件中的页面数量函数imcount()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回给定文件中的图像数量。 imcount 函数将返回多页图像中的页面数量&#xff0c;对于单页图像则返回 1。 函数原型 size_t cv::imcount (cons…...

【数据治理-构建数据标准体系】

构建数据标准体系分为六大主要步骤&#xff0c;分别是&#xff1a; 1、规划数据标准 2、开发数据标准 3、发布数据标准 4、执行数据标准 5、数据标准遵从检查 6、维护数据标准 1、规划数据标准 &#xff08;1&#xff09;数据标准的规划首先是在公司业务架构和数据架构的范围…...

AI新方向:OpenAI o1是一个更擅长思考的模型系列:高级推理+逻辑严密+更广泛的知识,用于解决复杂的逻辑问题,慢思考

之前推出AI store感觉偏应用&#xff0c;也千篇一律&#xff0c;是AI的一个方向&#xff1a;广度。 现在推出o1 更严密的逻辑&#xff0c;也是AI的一个方向&#xff1a;深度。花更多时间&#xff0c;推理复杂的任务并解决比以前的科学、编码和数学模型更难的问题。确保AI的使用…...

Laravel部署后,CPU 使用率过高

我在部署 Laravel 应用程序时遇到严重问题。当访问量稍微大一点的时候&#xff0c;cpu马上就到100%了&#xff0c; 找了一大堆文档和说明&#xff0c;都是说明laravel处理并发的能力太弱&#xff0c;还不如原生的php。最后找到swoole解决问题。 1、php下载swoole插件&#xff0…...

Rust调用tree-sitter支持自定义语言解析

要使用 Rust 调用 tree-sitter 解析自定义语言&#xff0c;你需要遵循一系列步骤来定义语言的语法&#xff0c;生成解析器&#xff0c;并在 Rust 中使用这个解析器。下面是详细步骤&#xff1a; 1. 定义自定义语言的语法 首先&#xff0c;你需要创建一个 tree-sitter 语言定义…...

如何解决跨域请求中的 CORS 错误

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介如何解决跨域请求中的 CORS 错误1. 引言2. 什么是 CORS&#xff1f;2.1 同源策略示例&#xff1a; 2.2 CORS 请求的类型 3. CORS 错误的原因3.1 常见 CORS 错误示例 4. 解决 CORS 错误的常见方法4.1 在服务器端启用 CORS4.1.1 Node…...

计算机知识科普问答--20(96-100)

文章目录 96、为什么要进行内存管理?1. **多进程环境中的内存共享与隔离**举例:2. **提高内存利用率**举例:3. **虚拟内存支持**举例:4. **内存分配的灵活性与效率**举例:5. **内存保护**举例:6. **内存分段和分页的管理**7. **内存交换(Swapping)**举例:8. **提升系统…...

济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理

近日&#xff0c;由中国开源软件推进联盟PG分会 & 齐鲁软件园联合发起的“PostgreSQL技术峰会济南站”在齐鲁开源社举办。瀚高股份IvorySQL作为合作伙伴受邀参加此次活动。 瀚高股份IvorySQL技术工程师 向逍 带来「IvorySQL中的Oracle XML函数兼容」的议题分享。在演讲中&a…...

【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch

【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search 目录 文章目录 【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search目录0. 论文信息1. 研究背景&#xff1a;2. 技术背景和发展历史&#xff1a;3. 算法建模3.1 模型架构3.1.1 双塔与分类 …...

海滨体育馆管理系统:SpringBoot实现技巧与案例

2系统关键技术 2.1JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…...

个人计算机与网络的安全

关于 wifi 大家都知道 wifi 已经使用了 wpa3 非常安全 但很多人不知道 pin 和 wps 这两项有漏洞 我发现很多用户都简单设置了这两项 他们的设置 使他们的网络出现了漏洞 关于 国产的 linux 老实说全是漏洞 默认开启 很多服务 但初始化的设置都有漏洞 关于 系统安全 老…...

AIGC教程:如何用Stable Diffusion+ControlNet做角色设计?

前言 对于生成型AI的画图能力&#xff0c;尤其是AI画美女的能力&#xff0c;相信同行们已经有了充分的了解。然而&#xff0c;对于游戏开发者而言&#xff0c;仅仅是漂亮的二维图片实际上很难直接用于角色设计&#xff0c;因为&#xff0c;除了设计风格之外&#xff0c;角色设…...

5V继电器模块详解(STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 relay.h文件 relay.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 继电器(Relay)&#xff0c;也称电驿&#xff0c;是一种电子控制器件&#xff0c;它具有控制系统…...

探究Spring的单例设计模式--单例Bean

Spring的单例设计模式 在Spring框架中&#xff0c;单例设计模式是一种常见且重要的设计模式&#xff0c;主要用于确保在应用程序的生命周期中仅创建一个特定的Bean实例 一、什么是单例设计模式&#xff1f; 单例设计模式是一种创建型设计模式&#xff0c;确保一个类只有一个…...

js基础速成-Set、Map

集合&#xff08;Set&#xff09; 集合是元素的集合&#xff0c;只能包含唯一元素 创建一个空集合 const companies new Set() console.log(companies)Set(0) {}从数组创建集合 const languages [英语,芬兰语,英语,法语,西班牙语,英语,法语, ]const setOfLanguages new …...

手机软件何时统一——桥接模式

文章目录 手机软件何时统一——桥接模式凭什么你的游戏我不能玩紧耦合的程序演化合成&#xff0f;聚合复用原则松耦合的程序桥接模式桥接模式基本代码 手机软件何时统一——桥接模式 凭什么你的游戏我不能玩 时间&#xff1a;5月31日20点  地点&#xff1a;大鸟房间  人物…...

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务&#xff08;Service&#xff09;和服务实例&#xff08;Instance&#xff09;定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务&#xff08;Service&#xff09;和服务实…...

基于微信小程序爱心领养小程序设计与实现(源码+参考文档+定制开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

【数据库】 MongoDB 用户分配新的角色和权限

在 MongoDB 中&#xff0c;可以通过简单的命令为用户分配新的角色和权限。这对于调整用户的访问能力和管理数据库安全至关重要。以下是如何为用户分配新的角色和权限的详细步骤。 1. 使用 MongoDB Shell 分配角色 1.1 修改用户角色 要为现有用户分配新的角色&#xff0c;可以…...

加速 Python for 循环

在 Python 编程中&#xff0c;for 循环是开发者常用的工具之一&#xff0c;但它的执行速度经常让人感到不满。幸运的是&#xff0c;有许多方法可以显著提高 for 循环的效率。 本文将介绍几种简单而高效的优化技巧&#xff0c;帮助你加速Python for 循环&#xff0c;速度提升从…...

计算机毕业设计 基于Python国潮男装微博评论数据分析系统的设计与实现 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

React 表单与事件

React 表单与事件 React 是一个用于构建用户界面的 JavaScript 库&#xff0c;它通过组件化的方式来提高开发效率和代码的可维护性。在 React 应用中&#xff0c;表单和事件处理是核心功能之一&#xff0c;它们允许用户与应用程序进行交互。本文将深入探讨 React 中的表单处理…...

Appium独立测试自动化初始化脚本

1、查看环境初始化参数 确保appium已经开起来了&#xff0c;设置ip ,并点击启动 打开夜神模拟器&#xff0c;点击工具--设置 最下面的版本说明&#xff0c;双击进去 版本号这里再去单击。 直到进入到开发者模式。 可能我们不是开发者模式打开的状态&#xff0c;所以软件访问模…...

Nginx反向代理配置支持websocket

一、官方文档 WebSocket proxying 为了将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket&#xff0c;使用了HTTP/1.1中可用的协议切换机制&#xff08;RFC 2616: Hypertext Transfer Protocol – HTTP/1.1&#xff09;。 然而&#xff0c;这里有一个微妙之处:由于“升级”…...

C# 游戏引擎中的协程

前言 书接上回&#xff0c;我谈到了Unity中的协程的重要性&#xff0c;虽然协程不是游戏开发“必要的”&#xff0c;但是它可以在很多地方发挥优势。 为了在Godot找回熟悉的Unity协程开发手感&#xff0c;不得不自己做一个协程系统&#xff0c;幸运的是&#xff0c;有了Unity的…...

如何封装微信小程序中的图片上传功能

文章目录 前言一、需求分析与设计思路二、上传图片功能封装三、页面调用示例四、功能改进与扩展4.1 压缩图片4.2 上传进度4.3 重试机制 五、总结 前言 在微信小程序开发中&#xff0c;图片上传功能是一个十分常见的需求&#xff0c;不管是社交分享、商城中的商品图片上传&…...