VUE 自定义 穿梭框

2023-11-12

某次项目要使用穿梭框进行数据选择,项目使用的element-ui框架,框架中的穿梭框是这样子的:

 好像不能满足我的需求,因为需要展示很多内容,包括图片等信息,也要加上很多样式等等,我尝试这去改造,一会后觉得还是自己动手去写一个靠谱。几经鼓捣效果如下:

 

 

 基本上实现了一个穿梭框。以上是展示内容,不包含实际使用。具体可以自定义实现其中的渲染格式。比如

上干货

<template>
  <div class="shuttle" :style="{'height':height}">
    <div class="shuttle_header" ref="header">
      <!-- 这个插槽是给筛选条件集成的,数据怎么来的由使用者处理 -->
      <slot name="header"></slot>
    </div>
    <div class="shuttle_body" :style="{'height':bodyHeight}">
      <div class="shuttle_body_left" ref="leftBody" @scroll="leftBodyScroll">
        <div class="shuttle_body_left_item" v-for="(item,index) in handleData" :key="index">
          <!-- 数据源列表,将渲染格式插入这个插槽 -->
          <slot name="source" v-bind:item="item"></slot>
          <input
            type="checkbox"
            name="vehicle"
            class="checkbox"
            v-model="item.$$shuttleSelect"
            @change="checkbox(item,'$$shuttleSelect')"
          />
        </div>
      </div>
      <div class="shuttle_body_center">
        <button type="button" class="_btn _btn_bule" @click="toRight()">{{ buttonText[0] }}</button>
        <button type="button" class="_btn _btn_bule" @click="toLeft()">{{ buttonText[1] }}</button>
      </div>
      <div class="shuttle_body_right" ref="rightBody">
        <div class="shuttle_body_right_item" v-for="(item,index) in choiceData" :key="index">
          <!-- 目标渲染插槽 -->
          <slot name="target" v-bind:item="item"></slot>
          <input
            type="checkbox"
            name="vehicle"
            class="checkbox"
            v-model="item.$$choiceSelect"
            @change="checkbox(item,'$$choiceSelect')"
          />
        </div>
      </div>
    </div>
  </div>
</template>

<script>
/***
 * 自定义穿梭框
 * author Maldway
 *
 *暂未实现全选
 */
export default {
  name: 'VueShuttle',
  data() {
    return {
      bodyHeight: 0,
      handleData: [],
      choiceData: [],
      leftSelectAll: false,
      rightSelectAll: false
    }
  },
  components: {
    //组件
  },
  props: {
    //参数
    /**
     * 渲染数据源
     */
    data: {
      type: Array,
      required: true
    },
    /**
     * 组件高度
     */
    height: {
      type: String,
      required: true
    },
    /***
     * 按钮文字
     */
    buttonText: {
      type: Array,
      default: function () {
        return ['向右移动', '向左移动']
      }
    },
    /***
     * 初始状态下左侧勾选的数据
     */
    leftDefaultChecked: {
      type: Array,
      default: function () {
        return []
      }
    },
    /***
     * 初始状态下左侧勾选的数据的key值
     */
    leftDefaultCheckedKey: {
      type: String
    }
  },
  computed: {
    //计算属性
  },
  watch: {
    //监听
    data: {
      handler(newObj, oldObj) {
        this.handleData = this.transformation()
      },
      immediate: true,
      deep: true
    }
  },
  created: function () {
    //可访问实例,dom还未渲染
  },
  mounted: function () {
    //dom已经挂载
    this.$nextTick(() => {
      /**
       * 动态设置高度
       */
      let offsetHeight = this.$refs.header.offsetHeight
      let height = this.height
      this.bodyHeight = `calc(${height} - ${offsetHeight}px)`
      /**
       * 初始化左侧勾选数据,并将勾选的数据移动到右边
       */
      if (
        this.leftDefaultChecked &&
        this.leftDefaultChecked.length > 0 &&
        this.leftDefaultCheckedKey &&
        this.leftDefaultCheckedKey != ''
      ) {
        for (let i in this.handleData) {
          let item = this.handleData[i]
          let is = this.leftDefaultChecked.includes(
            item[this.leftDefaultCheckedKey]
          )
          if (typeof item['$$shuttleSelect'] != 'undefined') {
            if (is) {
              item['$$shuttleSelect'] = true
            } else {
              item['$$shuttleSelect'] = false
            }
          }
        }
        // 移动到右边
        this.toRight()
      } else {
        console.warn('No default value')
      }
    })
  },
  methods: {
    /**
     * 左边滚动事件
     */
    leftBodyScroll() {
      //获取距离顶部的距离
      let leftBodyScrollTop = this.$refs.leftBody.scrollTop
      leftBodyScrollTop = parseFloat(leftBodyScrollTop.toFixed())
      // 获取可视区的高度
      let leftBodyClientHeight = this.$refs.leftBody.clientHeight
      // 获取滚动条的总高度
      let leftBodyScrollHeight = this.$refs.leftBody.scrollHeight
      if (leftBodyScrollTop + leftBodyClientHeight >= leftBodyScrollHeight) {
        // 把距离顶部的距离加上可视区域的高度 等于或者大于滚动条的总高度就是到达底部
        this.$emit('toLeftBottom')
      }
    },
    reset(newArray) {
      this.choiceData = []
      if (
        newArray &&
        newArray.length > 0 &&
        this.leftDefaultCheckedKey &&
        this.leftDefaultCheckedKey != ''
      ) {
        for (let i in this.handleData) {
          let item = this.handleData[i]
          let is = newArray.includes(item[this.leftDefaultCheckedKey])
          if (typeof item['$$shuttleSelect'] != 'undefined') {
            if (is) {
              item['$$shuttleSelect'] = true
            } else {
              item['$$shuttleSelect'] = false
            }
          }
        }
        // 移动到右边
        this.toRight()
      } else {
        for (let i in this.handleData) {
          let item = this.handleData[i]
          if (typeof item['$$shuttleSelect'] != 'undefined') {
            item['$$shuttleSelect'] = false
          }
        }
      }
    },
    obtain(attribute) {
      /***
       * 将指定属性名返回对应数组。
       * 获得选择数组对象中某个属性的数组。
       */
      let keyList = []
      for (let key in this.choiceData) {
        let item = this.choiceData[key]
        if (item['$$shuttleSelect']) {
          keyList.push(item[attribute + ''])
        }
      }
      return keyList
    },
    transformation() {
      //转变数据,添加自定义属性
      let $data = [...this.data]
      for (let key in $data) {
        let item = $data[key]
        if (typeof item !== 'object') {
          throw new Error('not Object')
        }
        //是否存在侵入的属性
        if (!item['$$shuttleSelect'] && !item['$$choiceSelect']) {
          this.$set(item, '$$shuttleSelect', false)
          this.$set(item, '$$choiceSelect', false)
        }
      }
      return $data
    },
    checkbox(item, key) {
      //选中
      item[key] = !item[key]
      if (item[key]) {
        item[key] = false
      } else {
        item[key] = true
      }
      /**
       * 取消全选
       */
      if (this.leftSelectAll && !item[key]) {
        this.leftSelectAll = false
      }
      if (this.rightSelectAll && !item[key]) {
        this.rightSelectAll = false
      }
      /**
       * 全选
       */
      if (!this.leftSelectAll && item[key]) {
        let is = this.handleData.every(function (item, index, array) {
          return item['$$shuttleSelect'] == true
        })
        this.leftSelectAll = is
      }
      if (!this.rightSelectAll && item[key]) {
        // 如果其中每一项都是true 的话就选中
        let is = this.choiceData.every(function (item, index, array) {
          return item['$$choiceSelect'] == true
        })
        this.rightSelectAll = is
      }
    },
    toRight() {
      //移动到右边
      this.choiceData = []
      for (let key in this.handleData) {
        let item = this.handleData[key]
        if (item['$$shuttleSelect']) {
          this.choiceData.push(item)
          item['$$choiceSelect'] = false
        }
      }
    },
    toLeft() {
      //移动到左边
      for (let i = 0; i < this.choiceData.length; ) {
        let item = this.choiceData[i]
        if (item['$$choiceSelect']) {
          item['$$shuttleSelect'] = false
          item['$$choiceSelect'] = false
          this.$delete(this.choiceData, i)
        } else {
          i++
        }
      }
    },
    isAllLeft() {
      if (this.leftSelectAll) {
        this.selectAllLeft(true)
      } else {
        this.selectAllLeft(false)
      }
    },
    isAllRight() {
      if (this.rightSelectAll) {
        this.selectAllRight(true)
      } else {
        this.selectAllRight(false)
      }
    },
    selectAllLeft(isSelect) {
      /**
       * 全选/取消 左边
       */
      for (let i in this.handleData) {
        let item = this.handleData[i]
        item['$$shuttleSelect'] = isSelect
      }
    },
    selectAllRight(isSelect) {
      /**
       * 全选/取消 右边
       */
      for (let i in this.choiceData) {
        let item = this.choiceData[i]
        item['$$choiceSelect'] = isSelect
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.shuttle {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  align-content: flex-start;
  position: relative;

  width: 100%;
  height: auto;
  padding: 10px;

  &_header {
    width: 100%;
    flex-basis: 100%;
    height: auto;
    position: relative;
    box-sizing: border-box;
    margin-bottom: 10px;
  }
  &_body {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    align-content: center;
    flex-basis: 100%;
    width: 100%;
    box-sizing: border-box;

    &_left,
    &_center,
    &_right {
      border-radius: 5px;
      height: 100%;
      overflow-y: auto;
      overflow-x: hidden;
      background: #fff;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
    }
    &_left {
      width: calc(50% - 120px);
      border: 1px solid #ebeef5;
      display: flex;
      flex-wrap: wrap;
      justify-content: flex-start;
      align-items: flex-start;
      align-content: flex-start;
      &_item {
        position: relative;
        border: 1px solid #ebeef5;
        margin: 10px;
        border-radius: 5px;
        .checkbox {
          position: absolute;
          top: 5px;
          left: 5px;
          width: 15px;
          height: 15px;
        }
      }
    }
    &_center {
      display: flex;
      flex-wrap: wrap;
      justify-content: center;
      align-items: center;
      align-content: center;
      width: 220px;
      ._btn {
        display: inline-block;
        line-height: 1;
        white-space: nowrap;
        cursor: pointer;
        background: #ffffff;
        border: 1px solid #dcdfe6;
        border-color: #dcdfe6;
        color: #606266;
        text-align: center;
        box-sizing: border-box;
        outline: none;
        margin: 0;
        transition: 0.1s;
        font-weight: 400;
        padding: 12px 20px;
        font-size: 14px;
        border-radius: 4px;

        &_bule {
          width: 100px;
          background: #46a6ff;
          border-color: #46a6ff;
          color: #ffffff;
          margin: 10px;
        }
      }
    }
    &_right {
      width: calc(50% - 120px);
      border: 1px solid #ebeef5;
      display: flex;
      flex-wrap: wrap;
      justify-content: flex-start;
      align-items: flex-start;
      align-content: flex-start;
      &_item {
        position: relative;
        border: 1px solid #ebeef5;
        margin: 10px;
        border-radius: 5px;
        .checkbox {
          position: absolute;
          top: 5px;
          left: 5px;
          width: 15px;
          height: 15px;
        }
      }
    }
  }
}
</style>

插件说明

属性名 类型 说明
data Array 渲染数据源
height String 组件高度;'100px'
buttonText Array ['向右移动', '向左移动']
leftDefaultChecked Array 初始状态下左侧勾选的数据
leftDefaultCheckedKey String 初始状态下左侧勾选的数据的key值

事件名 参数 说明
toLeftBottom none 左边选择框滑动到底事件,用于分页

方法名 参数 说明
obtain none 将指定属性名返回对应数组。获得选择数组对象中某个属性的数组。例如获取选中项id组成的数组。
selectAllLeft Boolen:isSelect 全选/取消 左边;根据入参isSelect
selectAllRight Boolen:isSelect 全选/取消 左边;根据入参isSelect

插槽名 数据 说明
header none 头部搜索等区域
source item 左边渲染区域
target item 右边渲染区域

使用示例

实际代码使用如下:

<template>
	<div class="app-container">
		<VueShuttle class="rectangle-shuttle" :data="shuttleOne.data" :height="shuttleOne.height">
			<template v-slot:source="{ item }">
				<div class="rectangle">
					<span class="rectangle_name"> {{ item.name }} </span>
					<span class="rectangle_sex"> {{ item.sex }} </span>
					<span class="rectangle_age"> {{ item.age }} </span>
					<p class="rectangle_hobby">
						<span v-for=" (h,i) in item.hobby" :key="h+i">
							{{ h }}
						</span>
					</p>
				</div>
			</template>
			<template v-slot:target="{ item }">
				<div class="rectangle">
					<span class="rectangle_name"> {{ item.name }} </span>
					<span class="rectangle_sex"> {{ item.sex }} </span>
					<span class="rectangle_age"> {{ item.age }} </span>
					<p class="rectangle_hobby">
						<span v-for=" (h,i) in item.hobby" :key="h+i">
							{{ h }}
						</span>
					</p>
				</div>
			</template>
		</VueShuttle>
	</div>
</template>

<script>
	import VueShuttle from '@/components/VueShuttle/index.vue'
	export default {
		name: '',
		data() {
			const getData = function(individual = 3) {
				const hobbyList = ['篮球', '足球', '排球', '游泳', '爬山', '羽毛球']
				const sexList = ['男', '女']
				const lastnameList = ['张', '王', '李', '刘']
				let peopleList = [];
				for (let i = 0; i < individual; i++) {
					peopleList.push({
						name: lastnameList[randomNum(0, lastnameList.length - 1)] + randomNum(0, lastnameList
							.length - 1),
						headImge: '',
						age: randomNum(18, 60),
						sex: sexList[randomNum(0, sexList.length - 1)],
						hobby: [hobbyList[randomNum(0, hobbyList.length - 1)], hobbyList[randomNum(0, hobbyList
							.length - 1)]]
					})
				}
				return peopleList;
			}
			const randomNum = function(minNum, maxNum) {
				return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
			}
			return {
				index: 3,
				shuttleOne: {
					data: getData(4),
					height: '360px'
				},
			}
		},
		components: {
			//组件
			VueShuttle
		},
		props: {
			//参数
		},
		computed: {
			//计算属性
		},
		watch: {
			//监听
		},
		created: function() {
			//可访问实例,dom还未渲染
		},
		mounted: function() {
			//dom已经挂载
		},
		methods: {

		}
	}
</script>

<style lang="scss" scoped>
	.app-container {
		.shuttle {
			margin-bottom: 20px;
		}
	}

	.rectangle-shuttle {
		.rectangle {
			display: flex;
			justify-content: flex-start;
			align-items: center;
			align-content: center;
			flex-wrap: wrap;
			padding-top: 20px;
			padding-left: 20px;
			width: 140px;
			height: 140px;

			&_name {
				display: inline-block;
				flex-basis: 100%;
				font-size: 24px;
				font-weight: bold;
			}

			&_sex {
				margin: 2px;
			}

			&_age {
				margin: 2px;
			}

			&_hobby {
				flex-basis: 100%;
			}
		}
	}
</style>

总结:

整体方案如下:

1.将传入的数据源添加选中标识,分为左选中与右选中。

2.选择部分插件渲染,将原数据通过插槽分发出去。

3.获取数据通过res属性持有引用调用方法。

4.预设(未测试)了全选与反选方法。

5.提供额外的插槽以集成搜索等所需部件。

6.提供上拉事件以集成分页功能。

这个插件主要功能就是提供了选择相关逻辑,将选择什么样的内容交由开发者自行处理,适合需要自定义内容的穿梭框或者变种表格等场景。

GitHub地址

VueShuttlehttps://github.com/iMaldway/VueShuttle

npm安装

npm -i vue-shuttle

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VUE 自定义 穿梭框 的相关文章

  • 创建一个简单的 10 秒倒计时

    我想要一行这样写的 Your download will begin in 10 9 8 etc Beginning on page load seconds 我已经设置了 10 秒下载文本 并且我还查看了其他 stackoverflow
  • GraphQL 预期可迭代,但未找到字段 xxx.yyy 的迭代

    我目前正在尝试使用 NodeJS 进行 GraphQL 但我不知道为什么以下查询会出现此错误 library name user name email 我不确定是否type of my resolveLibrary是对的 因为在任何例子中我
  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • 如何调用 google 的 getBasicProfile() 来仅单击按钮即可登录 google?

    我在我的网站上使用谷歌登录
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 如何打开弹出窗口并用父窗口中的数据填充它?

    如何使用 JavaScript jQuery 使用父页面中 JS 变量的数据填充弹出窗口 在我的示例中 我有一个文件名数组 我在父窗口中最多列出五个 如果还有更多 我想提供一个链接来打开弹出窗口并列出数组中的每个帖子 因此 如果我打开一个包
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • 强制输入数字小数位

    我想强制
  • Flowtype 属性“msg”缺失为 null 或未定义

    我发现 Flow 很难用 我明白那个Array find可以返回或未定义 因此 通过阅读以下内容 github Array find on Array 引发 https github com facebook flow issues 351
  • 使用 JQuery 根据下拉列表选择的值显示/隐藏控件

    我正在尝试使用 JQuery 根据下拉菜单的选定索引显示 隐藏 div 标签 但它不起作用 任何帮助将不胜感激 Thanks
  • Internet Explorer 9 是否会因数组和对象文字末尾的额外逗号而卡住?

    现代浏览器和 Node js 等环境允许您说 a 1 b 2 或 1 2 3 这在历史上一直是 Internet Explorer 的问题 Internet Explorer 9 中修复了此问题吗 对此有两种不同的答案 一种是对象初始值设定

随机推荐

  • 软件测试面试,一定要准备的7个高频面试题

    问题1 请自我介绍下 核心要素 个人技能优势 工作背景 经验亮点 参考回答 第一种 基本信息 离职理由 面试官您好 我叫张三 来自番茄市 在软件测试行业有 3 年的工作经验 做过 Web APP及小程序项目的测试工作 有独立负责整个项目的测
  • java -jar运行程序,但是断开服务器连接,就会关闭问题

    1 nohup java jar XXX jar gt log out 解析 把此进程作为后台进程运行 且把日志输出到log out文件中 2 指定jdk 进行项目启动 JAVA HOME bin java Xms 256m Xmx 102
  • vue面试题

    1 vue子组件调用父组件方法 方法1 直接在子组件中通过this parent event来调用父组件的方法 方法2 在子组件里用 emit向父组件触发一个事件 父组件监听这个事件就可以了 方法3 在父组件把方法传入子组件中 在子组件里直
  • JAVA开发运维(关于渗透测试与漏洞修复)

    对于C端的网站 H5 小程序或者app都需要进行渗透测试 渗透测试是模拟真实黑客的攻击手段 对目标网站或主机进行全面的安全评估 与黑客攻击不同 渗透测试的目的是尽可能多地发现安全漏洞 而真正的黑客只需要找到一种入侵 点击进入目标系统 一个好
  • Ubuntu18+ 使用redshift调色温 夜间闪烁

    问题描述 在Ubuntu 18 的系统上 使用redshift色温调节软件时 每到晚上 在切换软件时 还有其他奇怪的场景中 屏幕会有频闪现象 症状看来就像redshift反复开启和关闭 原因与解决方案 原因很可能是Ubuntu 18 的系统
  • chrome浏览器fitler中的XHR作用是什么

    chrome浏览器fitler中的XHR作用是什么 记录ajax中的请求 什么是 AJAX AJAX 异步 JavaScript 和 XML AJAX 是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换 AJAX 可以使网
  • SpringBoot集成LayuiAdmin的简单使用

    SpringBoot LayuiAdmin的简单使用 分享一下SpringBoot集成LayuiAdmin的一些心得体会 刚开始网上找了半天没找到集成教程 鼓捣了一阵只好自己上手了 快速开始 1 准备一份LayuiAdmin 源码压缩包解压
  • js——修改对象里面的属性名

    代码 var e avatar uploads 20230816 b30044ba6735c83bdea9d43b85c4ae15 jpeg mobile code 111 nickname 小土豆 e aaa e avatar delet
  • Elasticsearch 跨集群复制(CCR)的使用

    什么是 Elasticsearch 的跨集群复制 CCR Cross Cluster Replication 跨集群复制是 Elasticsearch v6 5 发布的一个新的特性 这个特性可以让你将一个集群的索引数据同步复制到远程的另外一
  • 学习太极创客 — MQTT 第二章(八)ESP8266 MQTT 用户密码认证

    视频链接 https www bilibili com video BV1fK4y1L72n spm id from 333 999 0 0 vd source b91967c499b23106586d7aa35af46413 资料链接 h
  • java上传视频文件到服务器,java视频上传到远程服务器

    java视频上传到远程服务器 内容精选 换一换 该步骤必须在root用户下执行 若以普通系统用户登录 需要执行su切换到root用户下执行后续操作 ssh keygen t rsa过程中需要 可选 输入保存的文件名 默认为在 root ss
  • C#学习笔记 委托

    定义委托 有时候可能想要将一个方法传递给另一个方法 在C 中使用函数指针来实现 在JavaScript中由于函数也是对象所以直接可以在参数列表中传递 而在C 中需要使用委托 要使用委托 首先需要定义它 定义一个接受两个int参数 返回一个i
  • 【HDU4741】空间解析几何

    1 题目链接 题目大意 给出两条空间中不平行的直线 求出这两条直线的距离和对应的点 2 分析 在空间中我们知道 直线有三种关系 相交 平行 异面 但是题目中已经说了 是不相交的直线 所以只可能有两种关系 平行或者异面 在空间中 直线方程并不
  • PATH环境变量变化,导致无法找到基本命令

    解决办法 好多命令的位置在 usr bin 恢复办法如下 1 由于找不到sudo 所以必须写全路径 其他命令如果提示找不到 也需要写全路径 usr bin sudo vi etc profile 2 末尾添加以下内容后保存 export P
  • android fwk开发之堡垒机的使用

    在Android堡垒机 Ubuntu 服务器上编译android AOSP源码 1 添加用户 1 切换到root用户 sudo su 2 添加账户 useradd m username 删除用户 userdel r username 使用u
  • 使用elementUI实现el-table表格跨行

    1 概述 element table 有一个属性 span method 可以设置单元格合并 通过给table传入span method方法可以实现合并行或列 方法的参数是一个对象 里面包含当前行row 当前列column 当前行号rowI
  • new bing聊天机器人免翻命令行使用--大佬逆向工程api

    使用 可以看到 IP地址在美国 使用步骤 下载地址 GitHub地址 或者命令行 python3 m pip install EdgeGPT upgrade 获取bing的cookie 不会控制台获取的 可以在edge插件里面下载cooki
  • 爬虫实战之《流浪地球》豆瓣影评分析(一)

    背景与挖掘目标 获取豆瓣评论数据 分析好评与差评的关键信息 分析评论数量及评分与时间的关系 分析评论者的城市分布情况 1 背景与挖掘目标 豆瓣 douban 是一个社区网站 网站由杨勃 网名 阿北 创立于2005年3月6日 该网站以书影音起
  • ChatGPT漫谈(二)

    ChatGPT 脱胎 于OpenAI在2020年发布的GPT 3 任何外行都可以使用GPT 3 在几分钟内提供示例 并获得所需的文本输出 GPT 3被认为是当时最强大的语言模型 但现在 ChatGPT模型似乎更强大 ChatGPT能进行天马
  • VUE 自定义 穿梭框

    某次项目要使用穿梭框进行数据选择 项目使用的element ui框架 框架中的穿梭框是这样子的 好像不能满足我的需求 因为需要展示很多内容 包括图片等信息 也要加上很多样式等等 我尝试这去改造 一会后觉得还是自己动手去写一个靠谱 几经鼓捣效