当前位置: 首页 > 编程日记 > 正文

canvas初尝试

最近学习了canvas,就拿它做了这么个小东西,感觉已经爱上canvas了。上代码

/*
* @auhor : 开发部-前端组-李鑫超
* @property { tableData :  {Array} 表格数据  add v-1.0.0 }
* @property { columData :  {Array} 表头数据  add v-1.0.0 }
* @property { menuList :  {Array} 右键菜单  add v-1.0.0 }
* @property { myKey :  {String} 唯一标识。  add v-1.0.0 }
* @property { isRadio :  {Boolean} 是否单选,默认false。  add v-1.0.0 }
* @property { showpage :  {Boolean} 是否显示分页,默认false。  add v-1.0.0 }
* @property { currentPage :  {Number} 当前页,默认false。  add v-1.0.0 }
* @property { pageSize :  {Number} 每页显示条目个数。  add v-1.0.0 }
* @property { pageTotal :  {Number} 总条目数。  add v-1.0.0 }
* @property { backMultipleSelection :  {Array} 回显数据。  add v-1.0.0 }
* @method  { makesure :  {Function(data)}  表头tree点击事件 add v-1.0.0 }
* @method  { menuClick :  {Function(item)} item 表格右键选项事件 add v-1.0.0 }
* @method  { currentPageChange :  {Function(page)} 当前页改变事件事件 add v-1.0.0 }
* @method  { handleSelect :  {Function(data)} 选中数据时会触发该事件 add v-1.0.0 }
* @version 1.0.0
* @edit: 2018/8/15
*/
<template><div class='air-table-wrapper'><el-table ref="table":show-header="true":data="tableData"tooltip-effect="dark"style="width: 100%;":height="height":header-row-class-name="headerClassName"id="table"@row-click="rowClick"@selection-change="selectionChange"@select-all="selectAll"@select="selectItem"@row-contextmenu="rowContextmenu"@row-dblclick="rowDblclick"@header-click="headerClick"v-drag><el-table-column v-if="!isRadio":type="isType"width="55"align="center"></el-table-column><el-table-column v-if="isType == 'index'":index="indexMethod"type="index":label="'序号'"width="55"align="center"></el-table-column><!--列表的表头循环--><el-table-column v-for="(column, index) in columData":key="index":label="column.name":width="column.width"><template slot-scope="scope"><!--把所有的数据都变成插槽导出--><slot :name="column.key":row="scope.row"></slot></template></el-table-column><template slot=appendv-if="showPage"><div :class="['el-table__append-page']"><el-pagination @size-change="handleSizeChange"@current-change="handleCurrentChange":current-page.sync="page":page-size="pageSize"layout="total, prev, pager, next":total="pageTotal"></el-pagination></div></template></el-table><air-contex-menu v-if="menuList.length":position="position":toggleShow="toggleShow":menuList="menuList"@menuClick="menuClick"></air-contex-menu><tree-dialog ref="treeDialog":pid="treePid":name="treeName":id="treeId":data="treeData"@makesure=makesureplaceholder="输入信息,按回车搜索":title='treeTitle'></tree-dialog></div>
</template>
<script>
import airContexMenu from "./contextMenu.js";
import treeDialog from "@/components/newCommon/dialog/treeDialog.vue";
export default {name: "airtable",// 框选的指令
    directives: {drag: {// 指令的定义inserted: function (el, binding, vnode) {var oDiv = el;vnode.context.tableTop = getY(oDiv);vnode.context.tableLeft = getX(oDiv);//方法是确定列表到屏幕的位置function getX(obj) {var parObj = obj;var left = obj.offsetLeft;while ((parObj = parObj.offsetParent)) {left += parObj.offsetLeft;}return left;}//方法是确定列表到屏幕的位置function getY(obj) {var parObj = obj;var top = obj.offsetTop;while ((parObj = parObj.offsetParent)) {top += parObj.offsetTop;}return top;}oDiv.onmousedown = function (ev) {// 防止奇葩操作if ([2, 3, 4, 5].indexOf(ev.buttons) > -1) {if (selDiv) {oDiv.getElementsByClassName("el-table__body")[0].removeChild(selDiv);}return}// 获取当前scrollTopvar scrollingTop = vnode.context.targetScroll;if (vnode.context.isRadio) return;//初始化不显示vnode.context.toggleShow = false;//确保用户在移动鼠标的时候只初始化一次选中var flag = true;// 获取表格的宽高let tableWidth = vnode.context.$el.clientWidth;let tableHeight = vnode.context.$el.clientHeight;//用来存储列表var selList = [];//获得指令下的dom对应的表格var fileNodes = oDiv.getElementsByTagName("tr");var countI = 0;//获得鼠标var evt = window.event || arguments[0];var startX = evt.x || evt.clientX;var startY = evt.y || evt.clientY;var top, left;//时时获得top = getY(oDiv);left = getX(oDiv);var selDiv = document.createElement("div");selDiv.style.cssText ="position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px solid rgba(255,165,22,0.38);background-color:rgba(0,0,0,0.38);z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;";selDiv.id = "selectDiv";oDiv.getElementsByClassName("el-table__body")[0].appendChild(selDiv);selDiv.style.left = startX + "px";selDiv.style.top = startY + "px";var _x = null;var _y = null;vnode.context.clearEventBubble(evt);// 打开开关vnode.context.mouseflag = true;// 鼠标拖动时画框document.onmousemove = function (ev) {evt = window.event || arguments[0];_x = evt.x || evt.clientX;_y = evt.y || evt.clientY;// 为了确定是点击事件还是移动事件if (Math.abs(_x - startX) < 5 && Math.abs(_y - startY) < 5) {return;}vnode.context.selectItemFlag = false;// 为了确保只有一次的渲染每次框选都把默认选中为空(针对当前页)if (flag) {// 重置选中cssfor (var i = 0; i < fileNodes.length; i++) {if (fileNodes[i].className.indexOf("el-table__row") != -1) {fileNodes[i].className = "el-table__row";selList.push(fileNodes[i]);}}// 判断当前页是否有选中的vnode.context.tableData.forEach((item) => {vnode.context.$refs.table.toggleRowSelection(item, false);vnode.context.multipleSelection.forEach((ele, i) => {if (item[vnode.context.myKey] == ele[vnode.context.myKey]) {vnode.context.$refs.table.toggleRowSelection(ele, false);vnode.context.multipleSelection.splice(ele, 1);i = i - 1;}})})flag = false;}// 判断鼠标移动是否超出在当前表格区域if (_x <= left || _x >= left + tableWidth || _y <= top || _y >= top + tableHeight) {document.onmousemove = null;if (selDiv) {oDiv.getElementsByClassName("el-table__body")[0].removeChild(selDiv);}(selList = null),(_x = null),(_y = null),(selDiv = null),(startX = null),(startY = null),(evt = null);vnode.context.mouseflag = false;vnode.context.$handleSelect();}if (vnode.context.mouseflag) {if (selDiv.style.display == "none") {selDiv.style.display = "";}var scrolling = oDiv.getElementsByClassName("is-scrolling-none");// 两个表格的时候需增加滚屏的高度// var main_scrolling=document.getElementsByClassName("common_table_height");// selDiv.style.left = Math.min(_x, startX)-left+scrolling[0].scrollLeft +main_scrolling[0].scrollLeft+ "px";selDiv.style.left =Math.min(_x, startX) - left + scrolling[0].scrollLeft + "px";//48是表头的高度// selDiv.style.top = Math.min(_y, startY)-top - 48 + scrolling[0].scrollTop+main_scrolling[0].scrollTop+ "px";selDiv.style.top =Math.min(_y, startY) - top - oDiv.getElementsByClassName("is-leaf")[0].offsetHeight + scrollingTop + "px";selDiv.style.width = Math.abs(_x - startX) + "px";if (scrolling[0].scrollTop > scrollingTop) {selDiv.style.height = Math.abs(_y - startY) + scrolling[0].scrollTop + "px";} else {selDiv.style.height = Math.abs(_y - startY) + "px";}// ---------------- 关键算法确定列表的选中靠的是index---------------------var _l = selDiv.offsetLeft,_t = selDiv.offsetTop;var _w = selDiv.offsetWidth,_h = selDiv.offsetHeight;for (var i = 0; i < selList.length; i++) {var sl = selList[i].offsetWidth + selList[i].offsetLeft;var st = selList[i].offsetHeight + selList[i].offsetTop;if (sl > _l &&st > _t &&selList[i].offsetLeft < _l + _w &&selList[i].offsetTop < _t + _h) {if (selList[i].className.indexOf("seled") == -1) {selList[i].className = selList[i].className + " seled";vnode.context.$refs.table.toggleRowSelection(vnode.context.tableData[i],true)vnode.context.multipleSelection.push(vnode.context.tableData[i])}} else {if (selList[i].className.indexOf("seled") != -1) {selList[i].className = "el-table__row";vnode.context.$refs.table.toggleRowSelection(vnode.context.tableData[i],false)let index = vnode.context.multipleSelection.indexOf(vnode.context.tableData[i])vnode.context.multipleSelection.splice(index, 1)}}}}if (document.onmousemove) {vnode.context.clearEventBubble(evt);}};//在鼠标抬起后做的重置oDiv.onmouseup = function () {//把鼠标移动事初始化document.onmousemove = null;if (selDiv) {oDiv.getElementsByClassName("el-table__body")[0].removeChild(selDiv);}(selList = null),(_x = null),(_y = null),(selDiv = null),(startX = null),(startY = null),(evt = null);vnode.context.mouseflag = false;// 防止重复$handleSelect()事件if (!vnode.context.selectItemFlag) {vnode.context.$handleSelect();vnode.context.selectItemFlag = false;}};};}}},components: {airContexMenu, treeDialog},props: {// 对于列表中唯一的字段myKey默认为id
        myKey: {type: String,default: "id"},//列表的数据
        tableData: {type: Array,default: () => []},//传过来的表头信息
        columData: {type: Array,default: () => []},//有没有checkbox
        isType: {type: String,default: "selection"},//右键菜单
        menuList: {type: Array,default: () => []},//分页的总页数
        pageTotal: {type: Number,default: 0},// 每页显示条数
        pageSize: {type: Number,default: 20},// 当前页
        currentPage: {type: Number,default: 1},// 当表格需要单选的时候
        isRadio: {type: Boolean,default: false},// table 回显数据
        backMultipleSelection: {type: Array,default: () => []},// 是否显示分页
        showPage: {type: Boolean,default: true},// 表格高度
        height: {type: [Number, String],default: 500}},data() {return {//指令中确定的时候是鼠标按下事件mouseflag: false,//选中的数组
            multipleSelection: [],//控制右键菜单弹出显示dialogVisible: false,//右键鼠标的位置
            position: {left: 0,top: 0},//控制右键显示隐藏toggleShow: false,//分页当前的页数page: this.currentPage,//当前右键点击的列
            currentRow: [],//当前滚动的距离,targetScroll: 0,// 是否点击单选按钮selectItemFlag: false,// 表头tree 数据
            treeData: [],treeName: '',treePid: '',treeId: '',treeTitle: "",// 表格top距离tableTop: null,tableLeft: null};},methods: {// 换算index
        indexMethod(index) {return index + (this.page - 1) * this.pageSize + 1;},//清除默认事件
        clearEventBubble(evt) {if (evt.stopPropagation) evt.stopPropagation();else evt.cancelBubble = true;if (evt.preventDefault) evt.preventDefault();else evt.returnValue = false;},//列表单击选中事件
        rowClick(row, event, column) {// 确定当前的row的indexvar index = 0;this.tableData.forEach((ele, i) => {if (ele[this.myKey] == row[this.myKey]) {index = i + 1;}});let flag = false;this.toggleShow = false;// 单选if (this.isRadio) {// 每次点击重置var dom = this.$refs.table.$el.getElementsByTagName("tr");this.tableData.forEach(ele => {this.$refs.table.toggleRowSelection(ele, false);});for (var i = 1; i < dom.length; i++) {dom[i].className = "el-table__row";}this.$refs.table.toggleRowSelection(row, true);this.$refs.table.$el.getElementsByTagName("tr")[index].className ="el-table__row seled";this.multipleSelection = Array.of(row)this.$handleSelect();return}this.selectItemFlag = true;// 如果有就删除this.multipleSelection.forEach((ele, i) => {if (ele[this.myKey] == row[this.myKey]) {this.$refs.table.toggleRowSelection(row, false);this.$refs.table.$el.getElementsByTagName("tr")[index].className ="el-table__row";flag = true;this.multipleSelection.splice(i, 1)}});// 如果没有就pushif (!flag) {this.$refs.table.toggleRowSelection(row, true);//后期优化吧 element的方法用不了 只能自己改变类名this.$refs.table.$el.getElementsByTagName("tr")[index].className ="el-table__row seled";this.multipleSelection.push(row)}this.$handleSelect();},//列表右键点击事件
        rowContextmenu(row, event) {//为当前的row赋值this.currentRow = row;//阻止默认右键点击事件event.returnValue = false;//获取右键坐标this.position.left = event.clientX;this.position.top = event.clientY;//菜单出现的flagthis.toggleShow = true;//显示弹出窗this.$emit("contextmenu", row, event);},//右键菜单弹出事件
        menuClick(item) {//右键点击以后隐藏this.toggleShow = false;this.$emit("rowContextmenu", item, this.currentRow);},//每页条数变化 ui定死每页20条
        handleSizeChange(val) {// console.log(`每页 ${val} 条`);
        },// 当前页变化
        handleCurrentChange(val) {this.page = val;this.$emit("currentPageChange", this.page);},//当批量选中结束调用
        $handleSelect() {console.log(this.multipleSelection)this.$emit("handleSelect", this.multipleSelection);},// 选项发生改变事件 ZZ
        selectionChange(val) {// console.log(val,"mdzz")// this.multipleSelection = val;
        },//监听表格的滚动
        handleScroll(e) {this.targetScroll = e.target.scrollTop;},//当单选时触发的事件
        selectItem(selection, row) {this.selectItemFlag = true;this.rowClick(row);},//当表头多选是触发的事件
        selectAll(selection) {this.selectItemFlag = true;var dom = this.$refs.table.$el.getElementsByTagName("tr");if (this.isRadio) {this.tableData.forEach(ele => {this.$refs.table.toggleRowSelection(ele, false);});for (var i = 1; i < dom.length; i++) {dom[i].className = "el-table__row";}return;}if (selection.length) {for (var i = 1; i < dom.length; i++) {//为了去掉表头的tr从1开始dom[i].className = "el-table__row seled";}this.multipleSelection = [...this.multipleSelection, ...selection];this.multipleSelection = [...new Set(this.multipleSelection)];} else {for (var i = 1; i < dom.length; i++) {dom[i].className = "el-table__row";}this.tableData.forEach((item) => {this.multipleSelection.forEach((ele, i) => {if (item[this.myKey] == ele[this.myKey]) {this.multipleSelection.splice(i, 1)i = i - 1;}})})}this.$handleSelect();},//双击事件
        rowDblclick(row, event) {this.$emit("rowDblclick", row, event);},// 表头点击事件
        headerClick(column, event) {if (event.target.nodeName === 'DIV')this.columData.map((item, index) => {if (item.name == column.label) {if (item.tree && item.tree.data.length) {this.$refs.treeDialog.$el.getElementsByClassName("el-dialog")[0].style.top = this.tableTop + 53 + 'px';this.$refs.treeDialog.$el.getElementsByClassName("el-dialog")[0].style.left = this.tableLeft + (event.path[1].scrollWidth) * (index) + 55 + 'px';this.treeData = item.tree.data;this.treePid = item.tree.pid;this.treeId = item.tree.id;this.treeName = item.tree.name;this.treeTitle = item.name;this.$refs.treeDialog.dialogOpen();}}})},clearData() {this.multipleSelection = []},// tree确定事件/
        makesure(data) {this.$emit('makesure', data);},initMultipleSelection() {this.$nextTick(() => {//获得tr对应index找到对应的dom 加入选中classvar dom = this.$refs.table.$el.getElementsByTagName("tr");this.$refs.table.clearSelection();this.tableData.forEach((ele, i) => {dom[i + 1].className = "el-table__row";});//为了传过来的值进行回显if (this.backMultipleSelection.length > 0) {this.backMultipleSelection.forEach(item => {this.tableData.forEach((ele, i) => {if (item[this.myKey] == ele[this.myKey]) {this.$refs.table.toggleRowSelection(ele, true);dom[i + 1].className = "el-table__row seled";}});});}});}},watch: {backMultipleSelection: {handler: function (newVal, oldVal) {//为了回显this.initMultipleSelection();},deep: true},currentPage: {handler(newValue, oldValue) {this.page = newValue;},immediate: true},tableData(val) {/* 监听table数据变化时(分页操作),已选中数据做回显 */this.$nextTick(() => {var dom = this.$refs.table.$el.getElementsByTagName("tr");this.$refs.table.clearSelection();this.tableData.forEach((ele, i) => {dom[i + 1].className = "el-table__row";});//为了已选中数据进行回显if (this.multipleSelection.length > 0) {this.multipleSelection.forEach(item => {this.tableData.forEach((ele, i) => {if (item[this.myKey] == ele[this.myKey]) {this.$refs.table.toggleRowSelection(ele, true);dom[i + 1].className = "el-table__row seled";}});});}let obj = this.$refs.table.$el.getElementsByClassName("el-table__body-wrapper")[0];if (obj.scrollHeight > obj.clientHeight) {this.$refs.table.$el.getElementsByClassName("el-table__append-wrapper")[0].style.cssText = "";}else{this.$refs.table.$el.getElementsByClassName("el-table__append-wrapper")[0].style.cssText = "position:absolute;right:0;bottom:0;";}})}},computed: {// 通过滚动距计算阴影 class
        headerClassName() {if (this.targetScroll == 0) {return "air-table-header__class"} else if (this.targetScroll > 0 && this.targetScroll <= 100) {return "air-table-header__class air-table-header__scroll1"} else if (this.targetScroll > 100 && this.targetScroll <= 200) {return "air-table-header__class air-table-header__scroll2"} else {return "air-table-header__class air-table-header__scroll3"}}},mounted() {document.onclick = () => {this.toggleShow = false;};this.initMultipleSelection();this.$refs.table.$refs.bodyWrapper.addEventListener('scroll', this.handleScroll);},beforeDestroy() {this.$refs.table.$refs.bodyWrapper.removeEventListener('scroll', this.handleScroll);}
};
</script><style lang="scss">
@import "../../../public/style/mixin.scss";.air-table-wrapper {@include wh(100%, 100%);%scroll-calss {width: 100%;height: 1px;position: absolute;top: 51px;left: 0;content: "";z-index: 2;}.seled {background: #f5f5f5 !important;}.no-seled {background: #ffffff !important;}.el-table__body tr {cursor: pointer;box-sizing: border-box;border-top: 1px solid #f5f5f5;border-bottom: 1px solid #f5f5f5;}.air-table-header__class th {padding: 9px 0 !important;box-sizing: border-box;border-bottom: 1px solid #f5f5f5 !important;}.air-table-header__scroll1 {position: relative;&::after {@extend %scroll-calss;box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2),0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12);}}.air-table-header__scroll2 {position: relative;&::after {@extend %scroll-calss;box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);}}.air-table-header__scroll3 {position: relative;&::after {@extend %scroll-calss;box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.2),0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 1px 8px 0 rgba(0, 0, 0, 0.12);}}.el-table__body td {box-sizing: border-box;border-bottom: 1px solid #f5f5f5;}.hover-row {border-top: 1px solid #f5f5f5;border-bottom: 1px solid #f5f5f5;background: #fafafa;}.el-table__append-page {.el-pagination {text-align: right;margin: 48px 0;}}.el-table__append-info {position: absolute;bottom: 0px;width: 100%;.el-pagination {text-align: right;}}.air-table__context--menu {box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2),0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);.air-table__context--list {cursor: pointer;height: 48px;@include flexCenter(flex-start, center);.air-table__context--icon {font-size: 14px;margin-left: 20px;color: #757575;}.air-table__context--info {font-size: 14px;margin-left: 20px;color: #212121;}}.air-table__context--list:hover {background: #f5f5f5;}}.el-table th {padding: 9px 0 !important;}.air-treeDialog-wrappers .el-dialog {margin: 0 !important;}
}
</style>

转载于:https://www.cnblogs.com/dongyuxin/p/9662082.html

相关文章:

模板1.0 -- 模板基本原理

为什么需要模板 我们经常有这样的一种使用的情形&#xff0c;就是我们可能需要设计一个函数&#xff0c;然后函数的参数可能是整形的&#xff0c;也可能是浮点型的&#xff0c;还有可能是其他的类型的&#xff0c;这个时候如果对于每一个类型都写一个函数&#xff0c;未免有点…

[置顶] 我的GB28181标准开发里程碑——基于eXosip的IPC端与SPVMN注册成功

昨天编译搭建好eXosip的开发环境后&#xff0c;今天完成了SIP注册功能&#xff0c;里程碑一战啊&#xff01;加油加油&#xff0c;成功就在眼前&#xff01; 今天基于eXosip做了一个IPC客户端&#xff0c;成功与公安部的SPVMN视频监控联网调测软件自测工具进行注册交互&#xf…

mysql如何避免特殊字符查询_如何避免MySQL中的特殊字符?

慕的地10843我已经用Java开发了自己的MySQL转义方法(如果对任何人都有用的话)。请参阅下面的类代码。警告&#xff1a;如果启用了任何_反斜杠_转义SQL模式&#xff0c;则出错。private static final HashMap sqlTokens;private static Pattern sqlTokenPattern;static{ …

visio 2010 修改 默认字体 字号大小 方法

哈哈&#xff0c;我这是标题党&#xff0c;先给大家泼个冷水。Visio2010 并不支持对一次性地修改绘图中所有图形的字体大小&#xff01;但可以有一个比较笨的方法解决。1.新建一个模具2.将常用的图形放到这个模具中3.对每个图形进行编辑4.对这个形状的字体&#xff0c;字号进行…

[BZOJ3329] Xorequ

题解&#xff1a; 网上的方法基本是建立在发现临位不能相等的基础上的 这个很好证。。 但是不利用这个特征也是可以的 x^2x3x 我们考虑二进制的前i位&#xff0c;我们会发现3x最多涉及到了前i2位 于是我们可以记录一下前i位的3x的i1,i2位的状态&#xff0c;以及第i位填了什么 因…

Asp.net中时间格式化的几种方法

1. 数据控件绑定时格式化日期方法:<asp:BoundColumn DataField"AddTime" HeaderText"添加时间" DataFormatString"{0:yyyy-MM-dd HH:mm}></asp:BoundColumn><asp:BoundField DataField"AddTime" HeaderText"添加时间&q…

centos设置网络自动启动

问题描述 centos7虚拟机如何设置开机自启动网络设置 解决方法 切换到root用户进入到网络设置的目录下面cd /etc/sysconfig/network-scripts/当前目录下面有一个类似于ifcfg-ens33&#xff0c;使用vim打开文件进行编辑&#xff0c;将ONBOOTno修改成为yes就可以了

mysql删除原则_MySQL数据库的增删选查

数据库是专门存储数据对象的容器&#xff0c;这里的数据对象包括表、视图、触发器、存储过程等&#xff0c;其中表是最基本的数据对象。创建数据库在 MySQL 数据库中存储数据对象之前&#xff0c;先要创建好数据库。语法&#xff1a;create database [if not exists] [[default…

ubuntu网卡配置

1、dhcp自动获取 sudo vi /etc/network/interfaces auto eth0 iface eth0 inet dhcp 设置生效: sudo /etc/init.d/networking restart 或 sudo dhclient eth0 2、静态IP地址 sudo vi /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.3.90 netmask 2…

自动化运维工具----ansible

自动化运维工具----ansible ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 主要模块以及功能&#xff1a; 1 command 2 user 3 group 4 cron 5 copy 6 file 7 ping 8 yum 9 service …

【内核】嵌入式linux内核的五个子系统

Perface Linux内核主要由进程调度&#xff08;SCHED&#xff09;、内存管理&#xff08;MM&#xff09;、虚拟文件系统&#xff08;VFS&#xff09;、网络接口&#xff08;NET&#xff09;和进程间通信&#xff08;IPC&#xff09;5个子系统组成&#xff0c;如图1所示。 图1 Li…

git用户文档1 — git基础

1. git基础 1.1 分布式 我们把远端仓库(云端的仓库)称为repo&#xff0c;repo必须有一个master分支&#xff0c;就是主分支。 repo除了有一个master分支&#xff0c;还有很多其他的分支&#xff0c;若干个分支之间存储的数据一版都是不一样的本地可以git clone下来repo的mast…

MySQL5.7的date类型_Mysql5.7 虚拟列数据类型为DATE时,如何存入数据?

表结构&#xff1a;v_date为虚拟列CREATE TABLE test ( json TEXT NULL, date DATETIME NULL DEFAULT NULL, v_date DATE AS (json_extract(json,$.date)) VIRTUAL)COMMENT测试表\r\nCOLLATEutf8mb4_general_ciENGINEInnoDB;插入&#xff1a;INSERT INTO test (json) …

找出字符串中所有数字

刚才网友在SKYPE问Insus.NET一个问题&#xff0c;在MS SQL中&#xff0c;怎样找出一个字符串所有数字。 Insus.NET使用较简单与平常的方法&#xff0c;就是使用循环的方法&#xff0c;循环字符串中每一个字符&#xff0c;并插入至一个表变量中。然后再SELECT这个表变量&#xf…

Safair 浏览器cllick事件不生效或者需要双击才生效

针对Safair 浏览器cllick事件不生效或者需要双击才生效的解决方案。 方法一&#xff1a;给元素加上cursor: pointer样式。&#xff08;不生效&#xff09; 方法二&#xff1a;ios事件机制不一样&#xff0c;将click事件改为mousedown或其他事件即可解决。&#xff08;需要双击&…

springboot mysql行锁_SpringBoot基于数据库实现简单的分布式锁

本文介绍SpringBoot基于数据库实现简单的分布式锁。1.简介分布式锁的方式有很多种&#xff0c;通常方案有&#xff1a;基于mysql数据库基于redis基于ZooKeeper网上的实现方式有很多&#xff0c;本文主要介绍的是如果使用mysql实现简单的分布式锁&#xff0c;加锁流程如下图&…

简单shell

执行脚本结果重定向 sh hah.sh hello 1>>/home/qiso/job.log 2>&1 上面这句话的意思是 首先通过sh执行脚本hah.sh&#xff0c;其中执行这个脚本的时候&#xff0c;需要传入参数&#xff0c;参数是hello&#xff0c; 1表示的是标准输出&#xff0c;以上脚本执行…

个人随笔、收藏——(包括技术、设计思想等)

1、开源自动化工具 Sahi、Selenium、AutoIt Sahi&#xff0c;是一个用于Web应用程序的自动测试工具。Sahi运行为一个代理服务器&#xff0c;必须把浏览器的代理设置为Sahi服务器。 然后Sahi注入javascript来访问Web页面中的元素。Sahi支持Http与Https并且独立于Web站点或Web应用…

安装QCreator2.5+Qt4.8.2+MinGW_gcc_4.4

QCreator最近升级了。正好想试试新功能&#xff0c;所以把原来安装的QCreator2.3.1Qt4.7.1卸载了。安装新的版本。具体步骤如下&#xff1a; 1# 下载QCreator2.5version。 2# 下载Qt4.8.2version。 3# 根据Qt官网给的链接&#xff0c;下载MinGW-gcc440_1&#xff08;因为从QCre…

第一次结对作业

211606368林书浩 211606352陈彬 一、预估与实际 PSP2.1Personal Software Process Stages预估耗时&#xff08;分钟&#xff09;实际耗时&#xff08;分钟&#xff09;Planning计划• Estimate• 估计这个任务需要多少时间3540Development开发• Analysis• 需求分析 (包括学习…

mysql如何根据业务分表设计_mysql分表分库的应用场景和设计方式

很多朋友在论坛和留言区域问mysql在什么情况下才需要进行分库分表&#xff0c;以及采用何种设计方式才是最优的选择&#xff0c;根据这些问题&#xff0c;小编为大家整理了关于MySQL分库分表的应用场景和最优的设计方式举例。一. 分表场景&#xff1a;对于大型的互联网应用来说…

简单protobuf

protobuf的数据类型&#xff0c;有最简单的那种数据类型&#xff0c;就是一个文件中&#xff0c;定义了一个message 可以在一个文件中定义两个message&#xff0c;两个message之间是没有关联的可以在一个文件中&#xff0c;定义两个message&#xff0c;其中一个是简单的&#x…

迭代器、生成器

迭代器 lst range(10) #生成一个枚举列表 从0-9 itr iter(lst) #生成一个迭代器 itr.next() #访问迭代器方法 遍历迭代器 try:while True:val itr.next()print val except StopIteration:pass 注意&#xff1a; 1、如果对list dict tuple 用for遍历&#xff0c;则for内部自动…

Linq 无法删除尚未附加的实体的问题

Linq删除个集合数据, 刚开始用的注释掉的那行, 会提示"无法删除尚未附加的实体"错误, 使用Attach方法依然不行. 想想以前用过DeleteAllOnSubmit没啥问题哈, 估计是_db对象的引用问题, 换了种写法就OK了. //删掉所有工作组部门关联 //wgdrLst Wor…

从云端到边缘 AI推动FPGA应用拓展

近日&#xff0c;全球最大的FPGA厂商赛灵思宣布收购深鉴科技的消息&#xff0c;引发人工智能芯片行业热议&#xff0c;这也是首起中国AI芯片公司被收购的案例。值得注意的是&#xff0c;收购深鉴科技的赛灵思在2018年下半年重点发展方面是汽车自动驾驶。 FPGA市场的竞争正在发生…

mysql中的%_mysql入门

MySQL数据库1 数据库概念(了解)1.1 什么是数据库数据库就是用来存储和管理数据的仓库&#xff01;数据库存储数据的优先&#xff1a;可存储大量数据&#xff1b;方便检索&#xff1b;保持数据的一致性、完整性&#xff1b;安全&#xff0c;可共享&#xff1b;通过组合分析&am…

关于timewait状态

四次挥手 主动关闭连接的一方&#xff0c;调用close&#xff0c;协议层发送FIN包&#xff0c;在TCP报头的FIN字段设置为1&#xff0c;意思是我要和你断开链接&#xff0c;主动关闭连接的一方进入到了FIN_WATI_1状态 被动关闭的一方收到了FIN包之后&#xff0c;协议层回复ACK包…

DWZ基于ajax重复请求的修复

在同一个通用上传插件,每次都需要客户端去请求服务器,返回的html页面,如果请求的间隔很短的话,ajax会认为是重复作废的请求,这个时候需要修改一下源码来达到在短时间内重复请求也能得到响应找到js/dwz.ajax.js修改源码为function ajaxTodo(url, callback){t Date.parse(new D…

TLS/HTTPS 证书生成与验证

https://www.cnblogs.com/kyrios/p/tls-and-certificates.html 最近在研究基于ssl的传输加密&#xff0c;涉及到了key和证书相关的话题&#xff0c;走了不少弯路&#xff0c;现在总结一下做个备忘 科普&#xff1a;TLS、SSL、HTTPS以及证书 不少人可能听过其中的超过3个名词&am…

高并发系统搭建:web负载均衡

高并发系统搭建&#xff1a;web负载均衡 所谓的负载均衡就是让多个请求尽量均衡的分配到不同的机器上面去 1. HTTP负载均衡 当用户的请求发来之后&#xff0c;web服务器通过修改HTTP响应报头中的Location标记&#xff0c;返回一个新的url&#xff0c;然后浏览器继续请求这个…