vue项目实战-脑图编辑管理系统kitymind百度脑图

前言

项目为前端vue项目,把kitymind百度脑图整合到前端vue项目中,显示了脑图的绘制,编辑,到处为json,png,text等格式的功能

文章末尾有相关的代码链接,代码只包含前端项目,在原始的项目中也编写了相关的接口,但是原先的后端项目是公司的,不方便公开出来,这里只提供我新写的前端项目,刚兴趣的同学可以把后端实现。

项目目录

项目的核心逻辑在public包下的local-kitymind文。件夹中,vue页面只是做了简单的引用,核心逻辑写在了diy.js与index.html两个文件当中

 下面是功能介绍以及相关实现。

脑图编辑页面

主页面展示

用户可以在编辑页编辑脑图文件,支持导出为各种格式,也可导入json文件,到处test,png,md,json等格式的文件,我个人新增了 “保存” 和 “内存为” 的按钮,在原系统中可以同后端进行交互,实现json信息的入库。

保存:

自动显示当前脑图所属版本,要求用户输入脑图名称和脑图描述,脑图名称为必填项

另存为:

用户点击另存为按钮,出现弹窗,要求用户输入脑图名称,描述,新建版本名称,新建版本描述,

功能实现

diy.js

在diy.js文件中我们定义了最上层若干按钮的样式以及对应的函数。

若干个导出按钮与导入导入按钮没有与后端交互,调用了百度脑图的api,另存为和保存按钮调用了在index.html中定义的vue函数,使得页面出现弹窗,同时将脑图的json转化为字符串保存在浏览器的localStorage中。下面是代码

(function () {
    var oldData;
    var baseURL =  'http://localhost:12222';
    // var baseURL = 'http://10.20.26.231:12222';
    var html = '';
    html += '<a href="" class="diy export" data-type="json">导出json</a>',
    html += '<a href="" class="diy export" data-type="md">导出md</a>',
    html += '<a href="" class="diy export" data-type="km">导出km</a>',
    html += '<a href="" class="diy export" data-type="svg">导出svg</a>',
    html += '<a href="" class="diy export" data-type="txt">导出text</a>',
    html += '<a href="" class="diy export" data-type="png">导出png</a>',
    html += '<button class="diy input">',
    html += '导入<input type="file" id="fileInput" accept=".km,.txt,.md,.json" >',
    html += '</button>'
    html += '<button class="diy httpinput">保存</button>',
    html += '<button class="diy httpinput2">另存为</button>',

    $('.editor-title').append(html);

    $('.diy').css({
        // 'height': '30px',
        // 'line-height': '30px',
        'margin-top': '0px',
        'float': 'right',
        'background-color': '#fff',
        'min-width': '60px',
        'text-decoration': 'none',
        color: '#999',
        'padding': '0 10px',
        border: 'none',
        'border-right': '1px solid #ccc',
    });
    $('.input').css({
        'overflow': 'hidden',
        'position': 'relative',
    }).find('input').css({
        cursor: 'pointer',
        position: 'absolute',
        top: 0,
        bottom: 0,
        left: 0,
        right: 0,
        display: 'inline-block',
        opacity: 0
    });
    // $('.httpinput').css({
    //     'overflow': 'hidden',
    //     'position': 'relative',
    // }).find('httpinput').css({
    //     cursor: 'pointer',
    //     position: 'absolute',
    //     top: 0,
    //     bottom: 0,
    //     left: 0,
    //     right: 0,
    //     display: 'inline-block',
    //     opacity: 0
    // });
    $('.httpinput2').css({
        'overflow': 'hidden',
        'position': 'relative',
    }).find('httpinput2').css({
        cursor: 'pointer',
        position: 'absolute',
        top: 0,
        bottom: 0,
        left: 0,
        right: 0,
        display: 'inline-block',
        opacity: 0
    });

    $(document).on('click', '.export', function (event) {
        event.preventDefault();
        var $this = $(this),
        type = $this.data('type'),
        exportType;
        switch (type) {
        case 'km':
            exportType = 'json';
            break;
        case 'md':
            exportType = 'markdown';
            break;
        case 'svg':
            exportType = 'svg';
            break;
        case 'txt':
            exportType = 'text';
            break;
        case 'png':
            exportType = 'png';
            break;
        default:
            exportType = type;
            break;
        }

        editor.minder.exportData(exportType).then(function (content) {
            switch (exportType) {
            case 'json':
                console.log($.parseJSON(content));
                break;
            default:
                console.log(content);
                break;
            }
            var blob = new Blob();
            switch (exportType) {
            case 'png':
                blob = dataURLtoBlob(content); //将base64编码转换为blob对象
                break;
            default:
                blob = new Blob([content]);
                break;
            }
            var a = document.createElement("a"); //建立标签,模拟点击下载
            a.download = $('#node_text1').text() + '.' + type;
            a.href = URL.createObjectURL(blob);
            a.click();

        });
    });
    //保存
    $(document).on('click', '.httpinput', async function (event) {
        // ct = await editor.minder.exportData('json')
		// console.log('shangyi');

        var ct;
		console.log('-------insert start-----')
		editor.minder.exportData('json').then(function (content) {
			ct = content;
            // console.log(ct)
            localStorage.setItem('brainJson',ct)
		});
        
        // console.log(version)

        myApp.openDialog()
         
    });
    //另存为
    $(document).on('click', '.httpinput2', async function (event) {
		console.log('shangyi');

        var ct;
		console.log('-------insert start-----')
		editor.minder.exportData('json').then(function (content) {
			ct = content;
            // console.log(ct)
            localStorage.setItem('brainJson',ct)
		});
        
        // console.log(version)

        myApp.openDialog2()
         
    });

    // 导入
    window.onload = function () {
        var fileInput = document.getElementById('fileInput');

        fileInput.addEventListener('change', function (e) {
            var file = fileInput.files[0],
            // textType = /(md|km)/,
            fileType = file.name.substr(file.name.lastIndexOf('.') + 1);
            console.log(file);
            switch (fileType) {
            case 'md':
                fileType = 'markdown';
                break;
            case 'txt':
                fileType = 'text';
                break;				
            case 'km':
            case 'json':
                fileType = 'json';
                break;
            default:
                console.log("File not supported!");
                alert('只支持.km、.md、、text、.json文件');
                return;
            }
            var reader = new FileReader();
            reader.onload = function (e) {
                var content = reader.result;
                editor.minder.importData(fileType, content).then(function (data) {
                    console.log(data)
                    $(fileInput).val('');
                });
            }
            reader.readAsText(file);
        });
    }

})();

//base64转换为图片blob
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(',');
    //注意base64的最后面中括号和引号是不转译的
    var _arr = arr[1].substring(0, arr[1].length - 2);
    var mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(_arr),
    n = bstr.length,
    u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {
        type: mime
    });
}

index.html文件

我们定义了页面标题等信息,引入kityminder-editor这个标签,同时使用elements-ui写了两个保存窗口 ,用户在“保存” 和 “另存为” 窗口可以点击“保存”按钮,则调用axios请求将json字符串发送至后端。

在发送请求的同时也会携带当前登陆者的信息,登陆者的信息是存储在cookie中,调用函数 getCookie('employeeId') 可以实现,但是用户这部分功能为公司项目,在我提供的代码中并未体现。

这里介绍一下 document.addEventListener 这个函数,在项目中他起到了初始化页面的作用,原先的项目逻辑为在 脑图管理页面 点击一条脑图信息,则讲相关信息存储到浏览器的localStorage中,然后调用脑图初始化的api,将json渲染到页面上,从而实现脑图的管理与跳转。下面是整体代码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>KityMinder Editor</title>

	<link href="favicon.ico" type="image/x-icon" rel="shortcut icon">

	<!-- bower:css -->
	<link rel="stylesheet" href="./bower_components/bootstrap/dist/css/bootstrap.css" />
	<link rel="stylesheet" href="./bower_components/codemirror/lib/codemirror.css" />
	<link rel="stylesheet" href="./bower_components/hotbox/hotbox.css" />
	<link rel="stylesheet" href="./bower_components/kityminder-core/dist/kityminder.core.css" />
	<link rel="stylesheet" href="./bower_components/color-picker/dist/color-picker.min.css" />
	<!-- endbower -->

	

	<link rel="stylesheet" href="kityminder.editor.min.css">

	<style>
		html, body {
			margin: 0;
			padding: 0;
			height: 100%;
			overflow: hidden;
		}
		h1.editor-title {
			background: #393F4F;
			color: white;
			margin: 0;
			height: 40px;
			font-size: 14px;
			line-height: 40px;
			font-family: 'Hiragino Sans GB', 'Arial', 'Microsoft Yahei';
			font-weight: normal;
			padding: 0 20px;
		}
		div.minder-editor-container {
			position: absolute;
			top: 40px;
			bottom: 0;
			left: 0;
			right: 0;
		}
	</style>
</head>

<body ng-app="kityminderDemo" ng-controller="MainController">
	
<h1 class="editor-title">
	<a href="http://www.huangyebo.cn" style="color: #fff;" target="_blank">
		KityMinder Editor
	</a>
<a href="https://beian.miit.gov.cn/" target="_blank"></a>
</h1>

<kityminder-editor on-init="initEditor(editor, minder)" data-theme="fresh-green"></kityminder-editor>
<iframe name="frameFile" style="display:none;"></iframe>

<div id="app">
	<el-dialog :visible.sync="dialogVisible" title="脑图保存">

		<el-form ref="form" :model="BrainMap" label-width="80px">
			<el-form-item label="脑图名称">
			  <el-input required="required" v-model="BrainMap.name"></el-input>
			</el-form-item>
			<el-form-item label="脑图描述">
				<el-input v-model="BrainMap.description"></el-input>
			</el-form-item>
			
			<el-form-item label="脑图版本">
			  <el-col :span="8">
				<el-input readonly v-model="BrainMap.version"></el-input>
			  </el-col>
			</el-form-item>

		
			<el-form-item>
			  <el-button type="primary" @click="onSubmit">保存</el-button>
			  <el-button>取消</el-button>
			</el-form-item>
		  </el-form>

	</el-dialog>

	<el-dialog :visible.sync="dialogVisible" title="另存为">

		<el-form ref="form" :model="BrainMap" label-width="80px">
			<el-form-item label="脑图名称">
			  <el-input required="required" v-model="BrainMap.name"></el-input>
			</el-form-item>
			<el-form-item label="脑图描述">
				<el-input v-model="BrainMap.description"></el-input>
			</el-form-item>
			
			<el-form-item label="版本名称">
			  <el-col >
				<el-input  v-model="versionName"></el-input>
			  </el-col>
			</el-form-item>

			<el-form-item label="版本描述">
				<el-col >
				  <el-input  v-model="versionDescription"></el-input>
				</el-col>
			  </el-form-item>

		
			<el-form-item>
			  <el-button type="primary" @click="saveVersion">保存</el-button>
			  <el-button>取消</el-button>
			</el-form-item>
		  </el-form>

	</el-dialog>
</div>

<div>
</div>
</body>

<!-- bower:js -->
<script src="./bower_components/jquery/dist/jquery.js"></script>
<script src="./bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="./bower_components/angular/angular.js"></script>
<script src="./bower_components/angular-bootstrap/ui-bootstrap-tpls.js"></script>
<script src="./bower_components/codemirror/lib/codemirror.js"></script>
<script src="./bower_components/codemirror/mode/xml/xml.js"></script>
<script src="./bower_components/codemirror/mode/javascript/javascript.js"></script>
<script src="./bower_components/codemirror/mode/css/css.js"></script>
<script src="./bower_components/codemirror/mode/htmlmixed/htmlmixed.js"></script>
<script src="./bower_components/codemirror/mode/markdown/markdown.js"></script>
<script src="./bower_components/codemirror/addon/mode/overlay.js"></script>
<script src="./bower_components/codemirror/mode/gfm/gfm.js"></script>
<script src="./bower_components/angular-ui-codemirror/ui-codemirror.js"></script>
<script src="./bower_components/marked/lib/marked.js"></script>
<script src="./bower_components/kity/dist/kity.min.js"></script>
<script src="./bower_components/hotbox/hotbox.js"></script>
<script src="./bower_components/json-diff/json-diff.js"></script>
<script src="./bower_components/kityminder-core/dist/kityminder.core.min.js"></script>
<script src="./bower_components/color-picker/dist/color-picker.min.js"></script>
<!-- endbower -->

<script src="kityminder.editor.min.js"></script>
<script src="diy.js"></script>

<!-- 引入 Vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 引入 Element-UI 样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入 Element-UI 组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>


<script>
	var baseURL =  'http://localhost:12222';
    // var baseURL = 'http://10.20.26.231:12222';

	angular.module('kityminderDemo', ['kityminderEditor'])
	.controller('MainController', function($scope) {
		$scope.initEditor = function(editor, minder) {
			window.editor = editor;
			window.minder = minder;
		};
	});

	function getCookie(name){
		var strcookie = document.cookie;//获取cookie字符串
		var arrcookie = strcookie.split("; ");//分割
		//遍历匹配
		console.log(arrcookie)
		for ( var i = 0; i < arrcookie.length; i++) {
			var arr = arrcookie[i].split("=");
			if (arr[0] == name){
				return arr[1];
			}
		}
		return "";
	}

	var myApp = new Vue({
      el: '#app',
      data() {
        return {
          dialogVisible: false, // 控制弹窗的显示和隐藏
		  versionDescription:'',
		  versionName:'',
		  BrainMap: {
				name: '',
				version: '',
				description: '',
				Json:'',
				employeeId:'',
			},
		
        }
      },
      methods: {
        openDialog() { //保存到旧版本
          this.dialogVisible = true; // 打开弹窗
		  this.BrainMap.version = localStorage.getItem('version')
        },
		openDialog2() { //另存为
          this.dialogVisible = true; // 打开弹窗
		//   this.BrainMap.version = localStorage.getItem('version')
        },
		onSubmit() {
			console.log('save!');
			this.BrainMap.Json = localStorage.getItem('brainJson')
			this.BrainMap.employeeId = getCookie('employeeId')
			if(this.BrainMap.name===''){
				this.$message({message:'脑图名不为空',type:'warning'})
				return
			}

			axios({
				method: 'POST',
				url: baseURL+'/common/saveBrainVersion',
				data: {
					json:this.BrainMap.Json,
					version:this.BrainMap.version,
					name: this.BrainMap.name,
					description: this.BrainMap.description,
					employeeId:this.BrainMap.employeeId,
				}
				})
				.then(response => {
					console.log( response)
				
				}, error => {
					console.log('错误', error.message)
			})

			this.dialogVisible = false
		},
		saveVersion() {
			var versionId = 0
			axios({
				method: 'get',
				url: baseURL+'/common/versionMaxId',
				params: {
                    }
				})
				.then(response => {
					versionId = response.data.data.id

					this.BrainMap.version = versionId + 1
					console.log(this.BrainMap.version)
					this.onSubmit()
				
				}, error => {
					console.log('错误', error.message)
			})


			axios({
				method: 'get',
				url: baseURL+'/common/saveVersion',
				params: {
                        versionName: this.versionName,
						description: this.versionDescription
                    }
				})
				.then(response => {
					console.log( response)
				
				}, error => {
					console.log('错误', error.message)
			})
			
			this.dialogVisible = false
		},
      }
    });

	document.addEventListener("DOMContentLoaded", function() {
      // 在页面加载完成后执行的 JavaScript 代码
      // 发起请求
		console.log("监听页面初始化")
		// var content = '{"root":{"data":{"id":"ctojgfitvug0","created":1687981368534,"text":"shangyi"},"children":[]},"template":"default","theme":"fresh-blue","version":"1.4.33"} '
		var content = localStorage.getItem('brainJson')
		editor.minder.importData('json', content).then(function (data) {
            // console.log(data)
        });
    });
</script>


</html>

项目链接:

脑图编辑管理系统前端: 基于百度脑图的二次开发,将百度脑图整合到vue中去,可以直接引入自己的项目

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stephen Wolfram:ChatGPT 的训练

The Training of ChatGPT ChatGPT 的训练 OK, so we’ve now given an outline of how ChatGPT works once it’s set up. But how did it get set up? How were all those 175 billion weights in its neural net determined? Basically they’re the result of very large…

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算&#xff0c;它有助于关闭前景物体内部的小孔&#xff0c;或去除物体上的小黑点&#xff0c;还可以将不同的前景图像进行连接。 例如&#xff0c;在图 8-17 中&#xff0c;通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔&#xff08;内部闭合的…

在Raspberry Pi 4上安装Ubuntu 20.04 + ROS noetic(不带显示器)

在Raspberry Pi 4上安装Ubuntu 20.04 ROS noetic&#xff08;不带显示器&#xff09; 1. 所需设备 所需设备&#xff1a; 树莓派 4 B 型 wifi microSD 卡&#xff1a;最小 32GB MicroSD 转 SD 适配器 &#xff08;可选&#xff09;显示器&#xff0c;鼠标等 2. 树莓派…

【山河送书第五期】:《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》参与活动,送书三本!!

《码上行动&#xff1a;利用Python与ChatGPT高效搞定Excel数据分析》 前言内容提要本书亮点购买链接参与方式往期赠书回顾&#xff1a; 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&#xff0c;这得益于数据科学和人工智能领域的发展&#xff0…

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接&#xff1a;金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展&#xff0c;银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上&#xff0c;金融机构运行过程中产生了大量的数字…

GNSS基本原理

大家都知道&#xff0c;GNSS卫星之所以能够对地球上的终端&#xff08;例如手机、汽车、轮船、飞机等&#xff09;进行定位&#xff0c;依靠的是三维坐标系。 找至少4颗卫星&#xff0c;分别计算各个卫星与终端之间的距离△L&#xff08;这个距离也被称为“伪距”&#xff09;&…

RISC-V基础之函数调用(五)函数递归调用及函数参数数量溢出(超出现有寄存器个数)约定(包含实例)

首先先解释一下栈在函数调用中的作用&#xff0c;更详细的部分请参照考研复习之数据结构笔记&#xff08;五&#xff09;栈和队列&#xff08;上&#xff09;&#xff08;包含栈的相关内容&#xff09;_管二狗赶快去工作&#xff01;的博客-CSDN博客 函数嵌套调用栈的作用是用…

深度学习常用的激活函数

深度学习的核心思想是通过多层次的神经网络结构&#xff0c;逐步抽取和表示数据中的高级特征&#xff0c;从而实现对复杂数据模式的学习和识别。 神经网络结构&#xff1a; 深度学习使用多层次的神经网络&#xff0c;包括输入层、隐藏层和输出层。这些网络结构允许模型自动学习…

手机上的照片怎么压缩?推荐这几种压缩方法

手机上的照片怎么压缩&#xff1f;如果你需要通过电子邮件或短信发送照片&#xff0c;则可能需要将其压缩为较小的文件大小以便于发送。另外&#xff0c;如果您你的手机存储空间有限&#xff0c;可以通过压缩照片来节省空间。下面就给大家介绍几种压缩手机照片的方法。 1、使用…

Leetcode-每日一题【剑指 Offer 21. 调整数组顺序使奇数位于偶数前面】

题目 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4]输出&#xff1a;[1,3,2,4] 注&#xff1a;[3,1,2,4] 也是正确的…

07 Ubuntu中使用poetry工具管理python环境——巨详细!!!

由于conda和ros2的环境实在太容易冲突了。我真的不敢再使用conda&#xff0c;着实是有些搞不明白这解释器之间的关系。 conda的卸载和ros2的安装暂不赘述&#xff0c;下面着重来说如何在Ubuntu中使用poetry进行包管理及遇到的问题。 1 安装poetry 由于在有写入权限的限制&am…

【Linux初阶】基础IO - 动静态库 | 初识、生成、链接、加载

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;动静态库初识&#xff0c;库的含义&#xff0c;静态库的生成与链接&#xff0c;gcc/g默认链接方式&#xff0c…

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…

这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是抓包&#…

项目出bug,找不到bug,如何拉回之前的版本

1.用gitee如何拉取代码 本文为转载于「闪耀太阳a」的原创文章原文链接&#xff1a;https://blog.csdn.net/Gufang617/article/details/119929145 怎么从gitee上拉取代码 1.首先找到gitee上想要拉取得代码URL地址 点击复制这里的https地址 1 ps:&#xff08;另外一种方法&…

Pytorch迁移学习使用MobileNet v3网络模型进行猫狗预测二分类

目录 1. MobileNet 1.1 MobileNet v1 1.1.1 深度可分离卷积 1.1.2 宽度和分辨率调整 1.2 MobileNet v2 1.2.1 倒残差模块 1.3 MobileNet v3 1.3.1 MobieNet V3 Block 1.3.2 MobileNet V3-Large网络结构 1.3.3 MobileNet V3预测猫狗二分类问题 送书活动 1. MobileNet …

【从零学习python 】03. Python交互式编程及注释详解

文章目录 了解pycharm交互式编程一、Python的交互式编程二、Pycharm里进入交互式编程三、IPython的安装和使用安装IPython使用IPython 四、交互式编程的优缺点注释注释的分类单行注释多行注释 进阶案例 了解pycharm 运行Pycharm,选择Create New Project,创建一个新的Python工程…

中文版开源Llama 2同时有了语言、多模态大模型,完全可商用

可以说&#xff0c;AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日&#xff0c;Meta 终于发布了免费可商用版本 Llama 2&#xff0c;让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…

小研究 - MySQL 分区分表的设计及实(一)

随着信息技术的快速发展&#xff0c;数据量越来越大&#xff0c;海量的表查询操作需要消耗大量的时间&#xff0c;成为影响数据库访问性能提高的主要因素。为了提升数据库操作的查询效率和用户体验&#xff0c;在关系型数据库管理系统(MySQL)中通过 range 分区和 Merge 存储&am…

sql 关联了2张表的 update 语句(转)

转自&#xff1a;SQL Update&#xff1a;使用一个表的数据更新另一张表 、update 关联两个表 基本上 select 能支持的关联和子查询操作&#xff0c;都能在 update 语句中使用。 在 where 条件中使用子查询 update a set a.age 1 where id in (select device_id from b) 在 wher…