vue 水印组件

2023-11-13

vue2 水印效果

效果图展示

在这里插入图片描述

Watermark

参数 说明 类型 默认值
width 水印的宽度,content 的默认值为自身的宽度 number 120
height 水印的高度,content 的默认值为自身的高度 number 64
rotate 水印绘制时,旋转的角度,单位 ° number -22
zIndex 追加的水印元素的 z-index number 9
image 图片源,建议导出 2 倍或 3 倍图,优先级高 string -
content 水印文字内容 string | string[] -
font 文字样式 Font Font
gap 水印之间的间距 [number, number] [100, 100]
clockwise 顺时针旋转 boolean true
opacity 水印的透明度 0~1 number 1
offset 水印距离容器左上角的偏移量,默认为 gap/2 [number, number] [gap[0]/2, gap[1]/2]

Font

参数 说明 类型 默认值
color 字体颜色 string rgba(0,0,0,.15)
fontSize 字体大小 number 16
fontWeight 字体粗细 normal | light | weight | number normal
fontFamily 字体类型 string sans-serif
fontStyle 字体样式 none | normal | italic | oblique normal

使用Watermark 组件

<!--
 * Copyright ©
 * #  
 * @author: zw
 * @date: 2023-05-11 
 -->

<template>
  <el-row v-parent-height>
    <el-col :span="8" class="bg-blue-50 h-80%">
      <el-card class="h-full" :body-style="{ margin: 0, padding: 0, height: '100%' }" v-style="{ marginTop: '80px' }">
        <el-form :model="form" ref="queryForm" :size="layoutSize" :inline="false" label-width="90px">
          <br />

          <el-col :span="22">
            <template v-for="(item, index) in form.content">
              <el-form-item :label="index <= 0 ? '水印内容' : '水印内容 ' + (index + 1)">
                <div class="flex items-center">
                  <el-input class="w-full" v-model="form.content[index]" placeholder="请输入文字信息" />

                  <el-button v-if="index === 0" class="ml-10" type="text" :size="layoutSize" icon="el-icon-circle-plus-outline" @click="form.content.splice(index + 1, 0, '')" />

                  <el-button v-if="index > 0" class="ml-10" v-style="{ color: 'red' }" type="text" :size="layoutSize" icon="el-icon-error" @click="form.content.splice(index, 1)" />
                </div>
              </el-form-item>
            </template>
          </el-col>

          <el-col :span="11">
            <el-form-item label="水平间距">
              <el-slider v-model="form.gap[0]" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="垂直间距">
              <el-slider v-model="form.gap[1]" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="水平偏移">
              <el-slider v-model="form.offset[0]" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="垂直偏移">
              <el-slider v-model="form.offset[1]" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="宽度">
              <el-slider v-model="form.width" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="高度">
              <el-slider v-model="form.height" :max="180" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="顺时针">
              <el-switch v-model="form.clockwise" :active-value="true" :inactive-value="false" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="旋转角度">
              <el-slider v-model="form.rotate" :max="90" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="水印层级">
              <el-slider v-model="form.zIndex" />
            </el-form-item>
          </el-col>

          <el-col :span="11">
            <el-form-item label="透明度">
              <el-slider v-model="form.opacity" :format-tooltip="(val) => val / 100" />
            </el-form-item>
          </el-col>

          <el-col :span="22">
            <el-form-item label="上传图片">
              <ImageUpload v-model="upload" @input="inputChange" :limit="1" />
            </el-form-item>
          </el-col>

          <el-col>
            <el-form-item>
              <el-button :size="layoutSize" type="info" @click="reset">重置</el-button>
            </el-form-item>
          </el-col>
        </el-form>
      </el-card>
    </el-col>

    <el-col :span="15" class="bg-blue-50 h-full">
      <Watermark v-parent-height v-bind="{ ...form, opacity: form.opacity / 100 }">
        <el-col class="mt-20 bg-yellow-50 text-gray-600" :span="13" :push="3"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Laudantium aut animi rerum veritatis? Nulla quas libero, rerum deserunt doloremque aspernatur, animi necessitatibus sunt a dicta nobis repellat odit, saepe maiores. </el-col>
        <el-col class="mt-20 bg-yellow-50 text-gray-600" :span="13" :push="3"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Laudantium aut animi rerum veritatis? Nulla quas libero, rerum deserunt doloremque aspernatur, animi necessitatibus sunt a dicta nobis repellat odit, saepe maiores. </el-col>
        <el-col class="mt-20 bg-yellow-50 text-gray-600" :span="13" :push="3"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Laudantium aut animi rerum veritatis? Nulla quas libero, rerum deserunt doloremque aspernatur, animi necessitatibus sunt a dicta nobis repellat odit, saepe maiores. </el-col>
        <el-col class="mt-20 bg-yellow-50 text-gray-600" :span="13" :push="3"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Laudantium aut animi rerum veritatis? Nulla quas libero, rerum deserunt doloremque aspernatur, animi necessitatibus sunt a dicta nobis repellat odit, saepe maiores. </el-col>
        <el-col class="mt-20 bg-yellow-50 text-gray-600" :span="13" :push="3"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Laudantium aut animi rerum veritatis? Nulla quas libero, rerum deserunt doloremque aspernatur, animi necessitatibus sunt a dicta nobis repellat odit, saepe maiores. </el-col>
      </Watermark>
    </el-col>
  </el-row>
</template>

<script>
import Watermark from '@/components/Watermark'
import ImageUpload from '@/components/ImageUpload'

export default {
  name: 'Watermark-template',
  components: { Watermark, ImageUpload },
  data() {
    return {
      form: {
        content: ['水印内容', '水印内容2', '水印内容3'],
        gap: [60, 60],
        offset: [100, 100],
        width: 120,
        height: 64,
        rotate: 45,
        zIndex: 9,
        image: '',
        clockwise: false,
        opacity: 100,
      },
      upload: [],
    }
  },

  mounted() {},

  methods: {
    reset() {
      Object.assign(this.$data.form, this.$options.data().form)
    },
    inputChange(_, list) {
      const image = list[0]?.base64
      this.form.image = image
    },
  },

  //  End
}
</script>

<style lang="css" scoped></style>

Watermark 组件

<!--
 * Copyright ©
 * #  
 * @author: zw
 * @date: 2023-05-09 
 -->

<template>
  <div class="watermark-container">
    <div class="watermark-content">
      <slot></slot>
    </div>
  </div>
</template>

<script>
let rate = 350
let lastClick = Date.now() - rate
const BaseSize = 2
const FontGap = 3
const getPixelRatio = () => window.devicePixelRatio || 1
const toLowercaseSeparator = (key) => key.replace(/([A-Z])/g, '-$1').toLowerCase()
const getStyleStr = (style) =>
  Object.keys(style)
    .map((key) => `${toLowercaseSeparator(key)}: ${style[key]};`)
    .join(' ')

function reRendering(mutation, watermarkElement) {
  let flag = false
  // 是否删除水印节点
  if (mutation.removedNodes.length) {
    flag = Array.from(mutation.removedNodes).some((node) => node === watermarkElement)
  }
  // 是否修改过水印dom属性值
  if (mutation.type === 'attributes' && mutation.target === watermarkElement) {
    flag = true
  }

  return flag
}
export default {
  name: 'Watermark',
  data() {
    return {
      watermarkRef: null,
      stopObservation: false,
      observe: null,
    }
  },
  props: {
    zIndex: { type: Number, default: 9 },
    rotate: { type: Number, default: -22 },
    width: { type: [String, Number], default: 120 },
    height: { type: [String, Number], default: 64 },
    image: { type: String, default: '' },
    content: { type: [String, Array], default: '' },
    font: {
      type: Object,
      default: () => ({
        fontSize: 16,
        fontFamily: 'sans-serif',
        fontStyle: 'normal',
        fontWeight: 'normal',
        color: 'rgba(0, 0, 0, 0.15)',
      }),
    },
    clockwise: { type: Boolean, default: true },
    opacity: { type: Number, default: 1 },
    rootClassName: '',
    gap: { type: Array, default: () => [20, 20] },
    offset: { type: Array, default: () => [100, 100] },
  },

  mounted() {
    this.renderWatermark()
    this.$nextTick(() => {
      this.observe = this.useMutationObserver(this.$el, this.onMutate, { attributes: true, childList: true, subtree: true })
    })
  },

  methods: {
    onMutate(records) {
      if (this.stopObservation) return

      records.forEach((mutation) => {
        if (!reRendering(mutation, this.watermarkRef)) return
        this.destroyWatermark()
        this.renderWatermark()
      })
    },
    useMutationObserver(target, callback, options) {
      const isSupported = typeof MutationObserver !== 'undefined'
      if (!isSupported) return false
      const observe = new MutationObserver(callback)
      observe.observe(target, options)
      return observe
    },
    getMarkSize(ctx) {
      const props = this.$props
      const { fontSize, fontFamily } = props.font

      let defaultWidth
      let defaultHeight
      const content = props.content
      const image = props.image
      const width = props.width
      const height = props.height

      if (!image && ctx.measureText) {
        ctx.font = `${Number(fontSize)}px ${fontFamily}`
        const contents = Array.isArray(content) ? content : [content]
        const widths = contents.map((item) => ctx.measureText(item).width)
        defaultWidth = Math.ceil(Math.max(...widths))
        defaultHeight = Number(fontSize.value) * contents.length + (contents.length - 1) * FontGap
      }

      return [width ?? defaultWidth, height ?? defaultHeight]
    },
    rotateWatermark(ctx, rotateX, rotateY, rotate) {
      const direction = this.$props.clockwise ? 1 : -1
      ctx.translate(rotateX, rotateY)
      ctx.rotate((Math.PI / 180) * Number(rotate) * direction)
      ctx.translate(-rotateX, -rotateY)
    },
    fillTexts(ctx, drawX, drawY, drawWidth, drawHeight) {
      const props = this.$props
      const { fontSize, fontFamily, fontStyle, fontWeight, color } = props.font

      const ratio = getPixelRatio()
      const content = props.content
      const mergedFontSize = Number(fontSize) * ratio
      ctx.font = `${fontStyle} normal ${fontWeight} ${mergedFontSize}px/${drawHeight}px ${fontFamily}`
      ctx.fillStyle = color
      ctx.textAlign = 'center'
      ctx.textBaseline = 'top'
      ctx.translate(drawWidth / 2, 0)
      const contents = Array.isArray(content) ? content : [content]
      contents?.forEach((item, index) => {
        ctx.fillText(item ?? '', drawX, drawY + index * (mergedFontSize + FontGap * ratio))
      })
    },
    appendWatermark(base64Url, markWidth) {
      if (!this.watermarkRef) return
      const props = this.$props
      const [gapX, gapY] = props.gap

      this.stopObservation = true
      const attrs = getStyleStr({ ...this.markStyle, backgroundImage: `url('${base64Url}')`, backgroundSize: `${(gapX + markWidth) * BaseSize}px` })
      this.watermarkRef.setAttribute('style', attrs)
      this.$el.append(this.watermarkRef)
      // 延迟执行
      setTimeout(() => {
        this.stopObservation = false
      })
    },
    renderWatermark() {
      const props = this.$props
      const [gapX, gapY] = props.gap

      const canvas = document.createElement('canvas')
      const ctx = canvas.getContext('2d')
      const image = props.image
      const rotate = props.rotate

      if (!ctx) return false
      if (!this.watermarkRef) {
        this.watermarkRef = document.createElement('div')
      }

      const ratio = getPixelRatio()
      const [markWidth, markHeight] = this.getMarkSize(ctx)
      const canvasWidth = (gapX + markWidth) * ratio
      const canvasHeight = (gapY + markHeight) * ratio
      canvas.setAttribute('width', `${canvasWidth * BaseSize}px`)
      canvas.setAttribute('height', `${canvasHeight * BaseSize}px`)

      const drawX = (gapX * ratio) / 2
      const drawY = (gapY * ratio) / 2
      const drawWidth = markWidth * ratio
      const drawHeight = markHeight * ratio
      const rotateX = (drawWidth + gapX * ratio) / 2
      const rotateY = (drawHeight + gapY * ratio) / 2
      /** 备选绘图参数 */
      const alternateDrawX = drawX + canvasWidth
      const alternateDrawY = drawY + canvasHeight
      const alternateRotateX = rotateX + canvasWidth
      const alternateRotateY = rotateY + canvasHeight

      ctx.save()
      this.rotateWatermark(ctx, rotateX, rotateY, rotate)

      if (image) {
        const img = new Image()
        img.onload = () => {
          ctx.drawImage(img, drawX, drawY, drawWidth, drawHeight)
          /** 旋转后绘制交错图 */
          ctx.restore()
          this.rotateWatermark(ctx, alternateRotateX, alternateRotateY, rotate)
          ctx.drawImage(img, alternateDrawX, alternateDrawY, drawWidth, drawHeight)
          this.appendWatermark(canvas.toDataURL(), markWidth)
        }
        img.crossOrigin = 'anonymous'
        img.referrerPolicy = 'no-referrer'
        img.src = image
      } else {
        this.fillTexts(ctx, drawX, drawY, drawWidth, drawHeight)
        /** 旋转后填充交错的文本*/
        ctx.restore()
        this.rotateWatermark(ctx, alternateRotateX, alternateRotateY, rotate)
        this.fillTexts(ctx, alternateDrawX, alternateDrawY, drawWidth, drawHeight)
        this.appendWatermark(canvas.toDataURL(), markWidth)
      }
    },
    destroyWatermark() {
      if (!this.watermarkRef) return
      this.watermarkRef.remove()
      this.watermarkRef = undefined
    },
  },

  computed: {
    markStyle() {
      const props = this.$props
      const [gapX, gapY] = props.gap
      const [offsetX, offsetY] = props.offset

      const gapXCenter = gapX / 2
      const gapYCenter = gapY / 2
      const offsetTop = offsetY || gapYCenter
      const offsetLeft = offsetX || gapXCenter

      const markStyle = {
        zIndex: this.zIndex,
        opacity: this.opacity,
        position: 'absolute',
        left: 0,
        top: 0,
        width: '100%',
        height: '100%',
        pointerEvents: 'none',
        backgroundRepeat: 'repeat',
      }

      let positionLeft = offsetLeft - gapXCenter
      let positionTop = offsetTop - gapYCenter
      if (positionLeft > 0) {
        markStyle.left = `${positionLeft}px`
        markStyle.width = `calc(100% - ${positionLeft}px)`
        positionLeft = 0
      }
      if (positionTop > 0) {
        markStyle.top = `${positionTop}px`
        markStyle.height = `calc(100% - ${positionTop}px)`
        positionTop = 0
      }
      markStyle.backgroundPosition = `${positionLeft}px ${positionTop}px`

      return markStyle
    },
  },

  watch: {
    $props: {
      handler() {
        if (Date.now() - lastClick >= rate) {
          this.stopObservation = true
          this.renderWatermark()
          // 延迟执行
          setTimeout(() => {
            this.stopObservation = false
            lastClick = Date.now()
          })
        }
      },
      deep: true,
    },
  },

  beforeDestroy() {
    this.destroyWatermark()
    this.observe.disconnect()
    this.observe = null
  },
  //  End
}
</script>

<style lang="scss" scoped>
.watermark-container {
  position: relative;
  .watermark-content {
    position: relative;
    z-index: 1;
  }
}
</style>

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

vue 水印组件 的相关文章

  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • 为什么 Eclipse 有时会对 JavaScript 中的数组数组发出警告?

    在 Eclipse 中 以下 JavaScript 行 var a1 1 2 3 4 生成警告 Type mismatch cannot convert from Number to any Type mismatch cannot con
  • 单击量角器中元素的给定坐标

    我想点击我的特定位置canvas元素 所以我编写了以下量角器代码 var canvas element by id canvas var clickCanvas function toRight toBottom browser actio
  • 如何在 jQuery 中使用 CSS“background-image”属性添加的图像上绑定单击事件

    这是我的小提琴link http jsbin com otisur 1 edit 我想我的问题通过标题本身就很清楚了 尽管如此 我正在寻找一种绑定的方法click使用 css 添加的图像上的事件background image财产 我知道
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • JavaScript 逻辑赋值是如何工作的?

    在 javascript 中 如果我们有一些代码 例如 var a one var b q a alert b 逻辑 OR 运算符会将 a 的值分配给 b 并且警报将为 一 这仅限于作业还是我们可以在任何地方使用它 似乎空字符串被视为与未定
  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • 使用 jQuery 的 javascript 关联数组长度

    我正在使用 javascript 关联数组 例如 var testarray testarray one 1 testarray two 2 testarray three 3 我也在旁边使用jquery 如何使用 jquery 或任何其他
  • 设置股票数据 Highcharts xAxis 的格式

    我已经浏览了需要为 xAxis 属性设置的 Highcharts 选项来格式化时间标签 但没有运气了解这对于这种情况到底是如何工作的 我在白天 盘中 检索了股票的动态数据 我需要显示这些数据 因为检索的数据每天从 9 30 开始到 17 0
  • 将 ESLint 与 Airbnb 样式和选项卡结合使用 (React.js)

    我正在开发一个 React js 应用程序 并且正在尝试检查我的代码 我将 ESLint 与 Airbnb 风格一起使用 但出现以下错误 src Test jsx 4 2 error Unexpected tab character no
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 如何按值删除数组中的多个项目?

    我正在尝试做一个removeAll 函数 它将删除具有该特定值 而不是索引 的数组的所有元素 当我们对循环进行任何更改时 棘手的部分就出现了 索引往往会移动 使其很难像我们想要的那样工作 并且每次更改时都重新启动循环 这在大数组上效率非常低
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • 使用 Javascript 检测 Pepper (PPAPI) Flash

    我们使用的是专有的文档查看器 它与某些 Chrome 版本中的 Pepper 版本的 Flash 配合得不太好 所以我希望能够检测到它并重定向到不同格式的相同内容 由于这个版本似乎落后于 NPAPI 版本 所以我一直在使用闪光检测 http
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 在 Javascript 中创建数组

    我对 javascript 不太熟悉 并且在用 javascript 制作 2d 或者也许我可能需要 3d 数组时遇到了一些麻烦 我目前需要收集 2 条信息 一个 ID 和一个值 因此我创建了以下内容 var myArray var id
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM

随机推荐

  • vscode安装使用教程

    一 什么是vscode Visual Studio Code 简称 VS Code VSC 是一款免费开源的现代化轻量级代码编辑器 支持几乎所有主流的开发语言的语法高亮 智能代码补全 自定义热键 括号匹配 代码片段 代码对比 Diff GI
  • 2022多益网络春招之最后一场--软件工程师笔试

    题型 选择 填空 简答 算法 凭借自己的回忆说一下题目类型 选择题 涉及到的题型主要是Java基础的题目 例如分析代码的时间复杂度 一些排序算法的时间复杂度 二叉排序树 sql语句 很简单 散列表 链表 什么数据结构具有记忆功能 连接查询
  • C++基础学习-29类模板概念,类模板定义、使用

    目录 一 概述 二 类模板的定义 三 类模板的成员函数 四 模板类名字的使用 五 非类模板参数 一 概述 用类模板来实例化一个特定的类 编译器不能为类模板推断参数类型 所以为了使用类模板 我们必须在类模板名后边用 lt gt 来提供额外的信
  • module.alias的更新

    一般通过hotplug的设备会通过module alias 中的信息来加载device对应的driver linux 1wlr lib modules 4 4 68 2 default modinfo ipmi ssif filename
  • vue3+vite+element plus+el-table中如何放置本地图片

    遇到bug 解决方案 vue组件 js代码
  • LZ77算法压缩和解压缩

    LZ77简介 Ziv和Lempel于1977年发表题为 顺序数据压缩的一个通用算法 A Universal Algorithm for Sequential Data Compression 的论文 论文中描述的算法被后人称为LZ77算法
  • 计算机的性能指标完全由cpu决定是否正确,计算机的性能指标完全由CPU决定对吗...

    电脑性能由CPU 中央处理器 主板 显卡 网卡 声卡等共同决定 如果主板 显卡不行 CPU再好也不行 这5个中 CPU 主板 显卡在决定电脑性能中占的比重大一些 推荐学习 phpstorm 1 运算速度 计算机运算速度是指每秒钟所能执行的指
  • 记录Windows10中Docker安装Mysql5.7

    DockerHub 搜索Mysql找到官方镜像 官方镜像地址 拉取mysql5 7版本镜像 拉取 docker pull mysql 5 7 查看docker 镜像 就能看到拉取的镜像 docker images 运行一个mysql容器 创
  • 电脑开机check_码住!常见电脑蓝屏代码和解决方法

    电脑蓝屏是很多人都碰到过的突发情况 引起电脑蓝屏的原因有很多 在软件方面 可能是因为个别软件或者驱动导致的 也可能是电脑中了病毒或者操作系统损坏等原因 硬件方面 可能是因为电脑散热不良 内存损坏 内存条接触不良或者电脑超频过度 硬盘坏道等问
  • anaconda换源和恢复默认源

    1 查看当前环境下的源 conda config show sources 2 换清华源 conda config add channels https mirrors tuna tsinghua edu cn anaconda pkgs
  • Android插件化主流框架和实现原理

    写在前面 这几年移动开发业界兴起的 插件化技术 的旋风 各个大厂都推出了自己的插件化框架 各种开源框架都评价自身功能优越性 令人目不暇接 随着公司业务快速发展 项目增多 开发资源却有限 如何能在有限资源内满足需求和项目的增长 同时又能快速响
  • (CentOS 7) PostgreSQL安装与配置

    一 安装相关配置软件 root www1 yum install y gcc x86 64 glibc x86 64 glibc devel x86 64 vim enhanced x86 64 gcc java apr apr devel
  • parted扩展磁盘分区(实践篇)

    系统环境 操作系统 centos7 2 前言 突然发现根下的空间不足了 没有找到可以释放的磁盘空间 所以决定要扩展一下磁盘分区 直接上操作 环境分析 发现根下的磁盘空间已经不是很充足了 看图片 显示的sda2的空间只给了280G 已经快要占
  • cgroup----devices子系统

    devices子系统 使用devices 子系统可以允许或者拒绝cgroup中的进程访问设备 devices子系统有三个控制文件 devices allow devices deny devices list devices allow用于
  • 下级对上级回复收悉_领导发微信“辛苦啦”怎么回复?学会这几点,让你被高看一眼...

    有网友说 在职场 领导晚上发微信交代任务 完成后发结果给他 领导回了句辛苦 如何巧妙回应他 有时候 简单的问题就不要特别复杂化 就像这个话题所言 领导给你发微信交代任务 你做完了后交差 领导回复句辛苦 我想这句话并没有特别深的含义 可能是领
  • 偏微分方程基础

    第五十篇 偏微分方程 一个偏微分方程 PDE 包含两个或多个自变量的导数 这与之前描述的常微分方程 ODE 相反 后者只涉及一个自变量 工程和科学中的许多现象都是用偏微分方程描述的 例如 一个因变量 如压力或温度 可以作为时间 t 和空间
  • 页面刷新后DataGrid重新定位

    VB NET Private Sub scroll ByVal index As Integer Dim s As String s Page RegisterStartupScript s End Sub C private void S
  • Qt中查看ui_xxx.h文件方法

    前提 1 Qt当有界面 2 构造完成 满足以上两个条件qt会生成ui xxx h文件 如何查看 方法1 在cpp文件中找到UI下的一个对象 如 ui gt textEdit Ui QWDialog 按住Ctrl键 使用鼠标左键点击UI下的一
  • Mybatis_lazyLoadingEnabled延迟加载配置

    via https item congci com content mybatis lazyloadingenabled yanchi jiazai peizhi 一 什么是延迟加载 resultMap可以实现高级映射 使用associat
  • vue 水印组件

    vue2 水印效果 效果图展示 Watermark 参数 说明 类型 默认值 width 水印的宽度 content 的默认值为自身的宽度 number 120 height 水印的高度 content 的默认值为自身的高度 number