Vue3描述列表(Descriptions)

news2024/9/20 22:42:31

😁 整体功能效果与 ant design vue 保持高度一致 😁

包含两种组件:DescriptionsDescriptionsItem(必须搭配使用!)

APIs

Descriptions

参数说明类型默认值必传
title描述列表的标题,显示在最顶部string | slot‘’false
bordered是否展示边框booleanfalsefalse
column一行的 DescriptionItems 数量,可以写成数值或支持响应式的对象写法 { xs: 8, sm: 16, md: 24}number | Responsive{xs: 1, sm: 2, md: 3}false
extra描述列表的操作区域,显示在右上方string | slot‘’false
size设置列表的大小‘default’ | ‘middle’ | ‘small’‘default’
labelStyle自定义标签样式,优先级低于 DescriptionItemsCSSProperties{}false
contentStyle自定义内容样式,优先级低于 DescriptionItemsCSSProperties{}false

Responsive Type

名称说明类型必传
xs<576px 响应式栅格numberfalse
sm≥576px 响应式栅格numberfalse
md≥768px 响应式栅格numberfalse
lg≥992px 响应式栅格numberfalse
xl≥1200px 响应式栅格numberfalse
xxl≥1600px 响应式栅格numberfalse

DescriptionsItem

参数说明类型默认值必传
label内容的描述标签string | slot‘’false
span包含列的数量number1false
labelStyle自定义标签样式,优先级高于 DescriptionCSSProperties{}false
contentStyle自定义内容样式,优先级高于 DescriptionCSSProperties{}false

效果如下图:在线预览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Descriptions组件

<script setup lang="ts">
import { onMounted, onUnmounted, computed, nextTick, ref, watch, watchEffect } from 'vue'
import type { CSSProperties } from 'vue'
interface Responsive {
  xs?: number // <576px 响应式栅格
  sm?: number // ≥576px 响应式栅格
  md?: number // ≥768px 响应式栅格
  lg?: number // ≥992px 响应式栅格
  xl?: number // ≥1200px 响应式栅格
  xxl?: number // ≥1600px 响应式栅格
}
interface Props {
  title?: string // 描述列表的标题,显示在最顶部 string | slot
  bordered?: boolean // 是否展示边框
  column?: number|Responsive // 一行的 DescriptionItems 数量,可以写成数值或支持响应式的对象写法 { xs: 8, sm: 16, md: 24}
  extra?: string // 描述列表的操作区域,显示在右上方 string | slot
  size?: 'default'|'middle'|'small' // 设置列表的大小
  labelStyle?: CSSProperties // 自定义标签样式,优先级低于 DescriptionItems
  contentStyle?: CSSProperties // 自定义内容样式,优先级低于 DescriptionItems
}
const props = withDefaults(defineProps<Props>(), {
  title: '',
  bordered: false,
  column: () => ({xs: 1, sm: 2, md: 3}),
  extra: '',
  size: 'default',
  labelStyle: () => ({}),
  contentStyle: () => ({})
})
const clientWidth = ref(document.documentElement.clientWidth)
onMounted(() => {
  window.addEventListener('resize', getBrowserSize)
})
onUnmounted(() => {
  window.removeEventListener('resize', getBrowserSize)
})
function getBrowserSize () {
  // document.documentElement返回<html>元素
  clientWidth.value = document.documentElement.clientWidth
}
const responsiveColumn = computed(() => {
  if (typeof props.column === 'object') {
    if (clientWidth.value >= 1600 && props.column.xxl) {
      return props.column.xxl
    }
    if (clientWidth.value >= 1200 && props.column.xl) {
      return props.column.xl
    }
    if (clientWidth.value >= 992 && props.column.lg) {
      return props.column.lg
    }
    if (clientWidth.value >= 768 && props.column.md) {
      return props.column.md
    }
    if (clientWidth.value >= 576 && props.column.sm) {
      return props.column.sm
    }
    if (clientWidth.value < 576 && props.column.xs) {
      return props.column.xs
    }
  }
  return props.column
})
const view = ref()
const children = ref() // DescriptionsItems 节点
const cols = ref() // 放置 DescriptionsItems 节点的模板引用数组
const rows = ref() // 放置 DescriptionsItems 节点的模板引用数组(带边框)
const groupItems = ref<any[]>([]) // 处理后的 DescriptionsItems 节点数组
const groupRows = computed(() => {
  return groupItems.value.length
})
watchEffect(() => {
  if (props.bordered) {
    children.value = Array.from(view.value.children).filter((element: any) => element.className === 'm-desc-item-bordered')
  } else {
    children.value = Array.from(view.value.children).filter((element: any) => element.className === 'm-desc-item')
  }
}, {flush: 'post'})
watch(children, (to) => {
  groupItems.value = []
  nextTick(() => {
    getGroupItems(to, responsiveColumn.value as number)
  })
})
watch(responsiveColumn, (to) => {
  groupItems.value = []
  nextTick(() => {
    getGroupItems(children.value, to as number)
  })
})
// 根据不同 cloumn 处理 DescriptionsItems 节点
function getGroupItems (children: any, responsiveColumn: number) {
  const len = children.length
  let group: any[] = []
  for (let n = 0; n < len; n++) {
    const item = {
      span: Math.min(children[n].__vnode.ctx.ctx.span, responsiveColumn),
      element: children[n]
    }
    if (getTotalSpan(group) < responsiveColumn) { // 已有 items 的 totalSpan < column
      item.span = Math.min(item.span, responsiveColumn - getTotalSpan(group))
      if (n === len - 1) { // 最后一个
        item.span = responsiveColumn - getTotalSpan(group)
      }
      group.push(item)
      if (n === len - 1) {
        groupItems.value.push(group)
      }
    } else {
      groupItems.value.push(group)
      group = [item]
      if (n === len - 1) { // 最后一个
        item.span = responsiveColumn
        groupItems.value.push(group)
      }
    }
  }
  if (props.bordered) { // 带边框
    nextTick(() => {
      groupItems.value.forEach((items: any, index: number) => {
        // 每一行 tr
        items.forEach((item: any) => {
          const itemChildren: any[] = Array.from(item.element.children)
          // 创建节点副本,否则原节点将先被移除,后插入到新位置,影响后续响应式布局计算
          const th = itemChildren[0].cloneNode(true)
          th.colSpan = 1
          // 动态添加节点样式
          setStyle(th, props.labelStyle)
          setStyle(th, item.element.__vnode.ctx.ctx.labelStyle)
          const td = itemChildren[1].cloneNode(true)
          td.colSpan = item.span * 2 - 1
          // 动态添加节点样式
          setStyle(td, props.contentStyle)
          setStyle(td, item.element.__vnode.ctx.ctx.contentStyle)
          // 插入节点到指定位置
          rows.value[index].appendChild(th)
          rows.value[index].appendChild(td)
        })
      })
    })
  } else {
    nextTick(() => {
      children.forEach((element: any, index: number) => {
        const elementChildren: any[] = Array.from(element.children)
        const label = elementChildren[0]
        // 动态添加节点样式
        setStyle(label, props.labelStyle)
        setStyle(label, element.__vnode.ctx.ctx.labelStyle)
        const content = elementChildren[1]
        // 动态添加节点样式
        setStyle(content, props.contentStyle)
        setStyle(content, element.__vnode.ctx.ctx.contentStyle)
        // 插入节点到指定位置
        cols.value[index].appendChild(element)
      })
    })
  }
}
// 计算当前 group 中所有 span 之和
function getTotalSpan (group: any): number {
  return group.reduce((accumulator: number, currentValue: any) => accumulator + currentValue.span, 0)
}
// 为元素添加内联样式
function setStyle(element: any, style: any) {
  if (JSON.stringify(style) !== "{}") {
    Object.keys(style).forEach(key => {
      element.style[key] = style[key]
    })
  }
}
</script>
<template>
  <div class="m-desc" :class="`desc-${size}`">
    <div class="m-header">
      <div class="u-title">
        <slot name="title">{{ title }}</slot>
      </div>
      <div class="u-extra">
        <slot name="extra">{{ extra }}</slot>
      </div>
    </div>
    <div ref="view" v-show="false">
      <slot></slot>
    </div>
    <div class="m-desc-view" :class="{'m-bordered': bordered}">
      <table>
        <tbody v-if="!bordered">
          <tr v-for="(items, row) in groupItems" :key="row">
            <td
              ref="cols"
              class="u-item-td"
              :colspan="item.span"
              v-for="(item, col) in items" :key="col">
            </td>
          </tr>
        </tbody>
        <tbody v-else>
          <template v-if="groupRows">
            <tr
              ref="rows"
              class="tr-bordered"
              v-for="row of groupRows" :key="row">
            </tr>
          </template>
        </tbody>
      </table>
    </div>
  </div>
</template>
<style lang="less" scoped>
.m-desc {
  font-size: 14px;
  color: rgba(0, 0, 0, .88);
  line-height: 1.5714285714285714;
  .m-header {
    display: flex;
    align-items: center;
    margin-bottom: 20px;
    .u-title {
      overflow: hidden;
      white-space: nowrap;
      text-overflow: ellipsis;
      flex: auto;
      font-weight: 600;
      font-size: 16px;
      color: rgba(0, 0, 0, .88);
      line-height: 1.5;
    }
    .u-extra {
      margin-inline-start: auto;
      color: rgba(0, 0, 0, .88);
      font-size: 14px;
    }
  }
  .m-desc-view {
    width: 100%;
    border-radius: 8px;
    table {
      width: 100%;
      table-layout: fixed;
      display: table; // 可选,只为兼容 vitepress 总 .vp-doc 的样式入侵,下同
      border-collapse: separate; // 可选
      margin: 0; // 可选
      tr { // 可选
        border: none;
        background: transparent;
      }
      .u-item-td {
        padding: 0; // 可选
        border: none; // 可选
        padding-bottom: 16px;
        vertical-align: top;
      }
    }
  }
  .m-bordered {
    border: 1px solid rgba(5, 5, 5, .06);
    table {
      table-layout: auto;
      border-collapse: collapse;
      display: table; // 可选
      margin: 0; // 可选
      .tr-bordered {
        border-bottom: 1px solid rgba(5, 5, 5, .06);
        &:last-child {
          border-bottom: none;
        }
        :deep(.u-label-th) {
          border: none; // 可选
          color: rgba(0, 0, 0, .88);
          font-weight: normal;
          font-size: 14px;
          line-height: 1.5714285714285714;
          text-align: start;
          background-color: rgba(0, 0, 0, .02);
          padding: 16px 24px;
          border-inline-end: 1px solid rgba(5, 5, 5, .06);
        }
        :deep(.u-content-td) {
          border: none; // 可选
          display: table-cell;
          flex: 1;
          padding: 16px 24px;
          border-inline-end: 1px solid rgba(5, 5, 5, .06);
          color: rgba(0, 0, 0, .88);
          font-size: 14px;
          line-height: 1.5714285714285714;
          word-break: break-word;
          overflow-wrap: break-word;
          &:last-child {
            border-inline-end: none;
          }
        }
      }
    }
  }
}
.desc-middle {
  .m-desc-view {
    .u-item-td {
      padding-bottom: 12px !important;
    }
  }
  .m-bordered {
    :deep(.u-label-th) {
      padding: 12px 24px !important;
    }
    :deep(.u-content-td) {
      padding: 12px 24px !important;
    }
  }
}
.desc-small {
  .m-desc-view {
    .u-item-td {
      padding-bottom: 8px !important;
    }
  }
  .m-bordered {
    :deep(.u-label-th) {
      padding: 8px 16px !important;
    }
    :deep(.u-content-td) {
      padding: 8px 16px !important;
    }
  }
}
</style>

DescriptionsItem组件

<script setup lang="ts">
import Descriptions from './Descriptions.vue'
import DescriptionsItem from './DescriptionsItem.vue'
import type { CSSProperties } from 'vue'
interface Props {
  label?: string // 内容的描述标签 string | slot
  span?: number // 包含列的数量
  labelStyle?: CSSProperties // 自定义标签样式,优先级高于 Description
  contentStyle?: CSSProperties // 自定义内容样式,优先级高于 Description
}
withDefaults(defineProps<Props>(), {
  label: '',
  span: 1,
  labelStyle: () => ({}),
  contentStyle: () => ({})
})
</script>
<template>
  <div class="m-desc-item">
    <span class="u-label" :style="labelStyle">
      <slot name="label">{{ label }}</slot>
    </span>
    <span class="u-content" :style="contentStyle">
      <slot></slot>
    </span>
  </div>
  <div class="m-desc-item-bordered">
    <th class="u-label-th" :style="labelStyle">
      <slot name="label">{{ label }}</slot>
    </th>
    <td class="u-content-td" :style="contentStyle">
      <slot></slot>
    </td>
  </div>
</template>
<style lang="less" scoped>
.m-desc-item {
  display: flex;
  .u-label {
    display: inline-flex;
    align-items: baseline;
    color: rgba(0, 0, 0, .88);
    font-weight: normal;
    font-size: 14px;
    line-height: 1.5714285714285714;
    text-align: start;
    &::after {
      content: ":";
      position: relative;
      top: -.5px;
      margin-inline: 2px 8px;
    }
  }
  .u-content {
    display: inline-flex;
    align-items: baseline;
    flex: 1;
    color: rgba(0, 0, 0, .88);
    font-size: 14px;
    line-height: 1.5714285714285714;
    word-break: break-word;
    overflow-wrap: break-word;
  }
}
</style>

在要使用的页面引入

其中引入使用了 Vue3单选(Radio)

<script setup lang="ts">
import { ref } from 'vue'
const size = ref('default')
const options = ref([
  {
    label: 'default',
    value: 'default'
  },
  {
    label: 'middle',
    value: 'middle'
  },
  {
    label: 'small',
    value: 'small'
  }
])
const onChange = (value: any) => {
  console.log('size checked', value)
  size.value = value
}
</script>
<template>
  <div>
    <h1>Descriptions 描述列表</h1>
    <h2 class="mt30 mb10">基本使用</h2>
    <Descriptions title="User Info">
      <template #extra>
        <a href="#">more</a>
      </template>
      <DescriptionsItem label="UserName">Zhou Maomao</DescriptionsItem>
      <DescriptionsItem label="Telephone">1810000000</DescriptionsItem>
      <DescriptionsItem label="Live">Hangzhou, Zhejiang</DescriptionsItem>
      <DescriptionsItem label="Remark">empty</DescriptionsItem>
      <DescriptionsItem label="Address">
        No. 18, Wantang Road, Xihu District, Hangzhou, Zhejiang, China
      </DescriptionsItem>
    </Descriptions>
    <h2 class="mt30 mb10">带边框的</h2>
    <Descriptions title="User Info" bordered>
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing Mode">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Automatic Renewal">YES</DescriptionsItem>
      <DescriptionsItem label="Order time">2018-04-24 18:00:00</DescriptionsItem>
      <DescriptionsItem label="Usage Time" :span="2">2019-04-24 18:00:00</DescriptionsItem>
      <DescriptionsItem label="Status" :span="3">
        <Badge status="processing" text="Running" />
      </DescriptionsItem>
      <DescriptionsItem label="Negotiated Amount">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official Receipts">$60.00</DescriptionsItem>
      <DescriptionsItem label="Config Info">
        Data disk type: MongoDB
        <br />
        Database version: 3.4
        <br />
        Package: dds.mongo.mid
        <br />
        Storage space: 10 GB
        <br />
        Replication factor: 3
        <br />
        Region: East China 1
        <br />
      </DescriptionsItem>
    </Descriptions>
    <h2 class="mt30 mb10">响应式描述列表</h2>
    <Descriptions
      title="Responsive Descriptions"
      bordered
      :column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }"
    >
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Time">18:00:00</DescriptionsItem>
      <DescriptionsItem label="Amount">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official">$60.00</DescriptionsItem>
      <DescriptionsItem label="Config Info">
        Data disk type: MongoDB
        <br />
        Database version: 3.4
        <br />
        Package: dds.mongo.mid
        <br />
        Storage space: 10 GB
        <br />
        Replication factor: 3
        <br />
        Region: East China 1
      </DescriptionsItem>
    </Descriptions>
    <h2 class="mt30 mb10">自定义尺寸</h2>
    <Radio :options="options" v-model:value="size" @change="onChange" />
    <br />
    <br />
    <Descriptions bordered title="Custom Size" :size="size">
      <template #extra>
        <Button type="primary">Edit</Button>
      </template>
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Time">18:00:00</DescriptionsItem>
      <DescriptionsItem label="Amount">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official">$60.00</DescriptionsItem>
      <DescriptionsItem label="Config Info">
        Data disk type: MongoDB
        <br />
        Database version: 3.4
        <br />
        Package: dds.mongo.mid
        <br />
        Storage space: 10 GB
        <br />
        Replication factor: 3
        <br />
        Region: East China 1
        <br />
      </DescriptionsItem>
    </Descriptions>
    <br />
    <br />
    <Descriptions title="Custom Size" :size="size">
      <template #extra>
        <Button type="primary">Edit</Button>
      </template>
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Time">18:00:00</DescriptionsItem>
      <DescriptionsItem label="Amount">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official">$60.00</DescriptionsItem>
    </Descriptions>
    <h2 class="mt30 mb10">自定义内容 & 标签样式</h2>
    <Descriptions
      bordered
      title="Custom Style"
      :labelStyle="{fontWeight: 800, color: '#faad14'}"
      :contentStyle="{fontWeight: 600, color: '#1677ff'}">
      <template #extra>
        <Button type="primary">Edit</Button>
      </template>
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Time">18:00:00</DescriptionsItem>
      <DescriptionsItem label="Amount" :labelStyle="{color: '#52c41a'}" :contentStyle="{color: '#ff4d4f'}">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official">$60.00</DescriptionsItem>
      <DescriptionsItem label="Config Info">
        Data disk type: MongoDB
        <br />
        Database version: 3.4
        <br />
        Package: dds.mongo.mid
        <br />
        Storage space: 10 GB
        <br />
        Replication factor: 3
        <br />
        Region: East China 1
        <br />
      </DescriptionsItem>
    </Descriptions>
    <br />
    <br />
    <Descriptions
      title="Custom Style"
      :labelStyle="{fontWeight: 800, color: '#faad14'}"
      :contentStyle="{fontWeight: 600, color: '#1677ff'}">
      <template #extra>
        <Button type="primary">Edit</Button>
      </template>
      <DescriptionsItem label="Product">Cloud Database</DescriptionsItem>
      <DescriptionsItem label="Billing">Prepaid</DescriptionsItem>
      <DescriptionsItem label="Time">18:00:00</DescriptionsItem>
      <DescriptionsItem label="Amount" :labelStyle="{color: '#52c41a'}" :contentStyle="{color: '#ff4d4f'}">$80.00</DescriptionsItem>
      <DescriptionsItem label="Discount">$20.00</DescriptionsItem>
      <DescriptionsItem label="Official">$60.00</DescriptionsItem>
    </Descriptions>
  </div>
</template>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dos 命令简介

DOS 简介 DOS是Disk Operating System的缩写&#xff0c;即“磁盘操作系统”。DOS主要是一种面向磁盘的系统软件&#xff0c;有了DOS&#xff0c;我们就可以更容易理解怎么给机器下命令&#xff0c;不必去深入了解机器的硬件结构&#xff0c;也不必去死记硬背那些枯燥2进制数字…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

二叉树进阶版(C)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

静态路由下一跳地址怎么确定(基本静态路由配置实验步骤)

什么是静态路由&#xff1f;静态路由是路由的一种方式&#xff0c;路由项由手动配置&#xff0c;而非动态决定。与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变&#xff0c;即使网络状况已经改变或是重新被组态。一般来说&#xff0c;静态路由是由网络管理员…

MySQL做分布式锁

分布式锁mysql实现方式 方式1&#xff1a;唯一索引 创建锁表&#xff0c;内部存在字段表示资源名及资源描述&#xff0c;同一资源名使用数据库唯一性限制。多个进程同时往数据库锁表中写入对某个资源的占有记录&#xff0c;当某个进程成功写入时则表示其获取锁成功其他进程由于…

iOS——Block two

Block 的实质究竟是什么呢&#xff1f;类型&#xff1f;变量&#xff1f;还是什么黑科技&#xff1f; Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件&#xff0c;并写好 block 的相关代码。打开「终端」&#xff0c;执行 cd XX…

Windows 使用 Linux 子系统,轻轻松松安装多个linux

Windows Subsystem for Linux WSL 简称WSL,是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机&#…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

Vue + el-upload阿里云文件上传进度条功能,阿里云文件上传切片进度条功能实现,el-upload文件上传真实进度条

el-upload阿里云文件上传进度条功能&#xff0c;进度条切片功能&#xff0c;做一个记录&#xff0c;此功能查询过其他文档&#xff0c;最终都还是实现不了&#xff08;这是真实进度条&#xff0c;就是根据文件上传过程中文件切片实现的&#xff09; 效果&#xff1a; <t…

电脑黑屏按什么键恢复?掌握这3个按键,轻松解决!

“电脑怎么会突然就黑屏呢&#xff1f;我看综艺看得好好的莫名其妙电脑就黑屏了&#xff0c;怎么按都没有用。电脑黑屏应该怎么解决呢&#xff1f;大佬快帮帮我&#xff01;” 对于电脑黑屏的问题&#xff0c;很多小伙伴应该都不陌生吧。在实际使用电脑的操作中&#xff0c;或许…

干货 | 三款民宿App会员评测,你都用过吗?

为了留存用户&#xff0c;许多旅游住宿类APP都开通了会员权益&#xff0c;对老用户来说&#xff0c;会员等级的提升会为他们带来更多的权益及优惠&#xff0c;那么问题来了&#xff0c;到底哪家的会员优惠更多呢&#xff1f; 根据第三方统计的下载数据来看&#xff0c;APP STO…

云计算与大数据领域新指南 | 《揭秘云计算与大数据》助您驾驭数字化浪潮!

日前&#xff0c;《揭秘云计算与大数据》正式上市。这本由国际知名的技术专家撰写的书籍&#xff0c;将带领读者深入了解云计算和大数据领域的技术前沿和应用趋势&#xff0c;为读者呈现一个全面而深入的视角。 随着信息技术的飞速发展&#xff0c;云计算和大数据作为两大前沿…

iOS——Block回调

先跟着我实现最简单的 Block 回调传参的使用&#xff0c;如果你能举一反三&#xff0c;基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能&#xff08;其实是烂大街又最形象的例子&#xff09;&#xff1a; 有两个视图控…

自问自答----WEB篇

目录 1、https和http协议的端口 2、http协议的版本 3、linux中查看报文的方法 3.1 curl www.baidu.com -v 3.2 wget --debug www.baidu.com 4、http有哪些请求方法 5、http的请求头 6、http响应头​编辑 7、状态码有哪些 8、uri和url 9、静态&#xff1f;动态&#x…

第九章 HL7 架构和可用工具 - 查看批量消息

文章目录 第九章 HL7 架构和可用工具 - 查看批量消息查看批量消息Class类有关 HL7 消息类别的详细信息TypeCategoryName 第九章 HL7 架构和可用工具 - 查看批量消息 查看批量消息 如果消息是一组批处理格式的 HL7 消息&#xff0c;而不是单个 HL7 消息&#xff0c;则 HL7 文档…

三星书画联展:三位艺术家开启国风艺术之旅

7月22日&#xff0c;由广州白云区文联、白云区工商联主办的“三星书画联展”&#xff0c;在源美术馆正式开展。本次书画展展出的艺术种类丰富&#xff0c;油画、国画、彩墨画、书法等作品异彩纷呈。广东省政协原副主席、农工党省委书画院名誉院长马光瑜&#xff0c;意大利艺术研…

小程序安全性加固:如何保护用户数据和防止恶意攻击

第一章&#xff1a;引言 在当今数字化时代&#xff0c;移动应用程序的使用已经成为人们日常生活中的重要组成部分。小程序作为一种轻量级的应用程序形式&#xff0c;受到了广泛的欢迎。然而&#xff0c;随着小程序的流行&#xff0c;安全性问题也日益凸显。用户数据泄露和恶意攻…

SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)

初衷 &#x1f4a2;初衷&#x1f4a2; 因为一遍遍修改并重启项目觉得很麻烦&#xff0c;所以刚开始就自己给项目配置了热加载&#xff0c;但奈何代码更新还是慢&#xff0c;还不如我重启一遍项目的速度&#xff0c;所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…

星戈瑞 | DSPE-PEG-CY5荧光成像技术在生物医学研究中的重要性

DSPE-PEG-CY5荧光成像技术在生物医学研究中具有重要性&#xff0c;其在成像和标记方面的优势为生物学和医学领域提供了强大的工具。以下是DSPE-PEG-CY5荧光成像技术在生物医学研究中的重要性&#xff1a; 1. 非侵入性成像&#xff1a;DSPE-PEG-CY5荧光成像技术是一种非侵入性的…

面试必考精华版Leetcode2095. 删除链表的中间节点

题目&#xff1a; 代码&#xff08;首刷看解析 day22&#xff09;&#xff1a; class Solution { public:ListNode* deleteMiddle(ListNode* head) {if(head->nextnullptr) return nullptr;ListNode *righthead;ListNode *lefthead;ListNode *NodeBeforeLeft;while(right!n…