reactHooks+TS:富文本braft-editor常见用法

news2024/11/25 6:37:47

react富文本braft-editor使用

阅读文档推荐:https://www.yuque.com/braft-editor/be、https://braft.margox.cn/demos/code-highlighter、

1、安装

# 使用npm安装
npm install braft-editor --save

# 使用yarn安装
yarn add braft-editor

2、基本使用

第一步:引入braft-editor

//引入富文本编辑器
import BraftEditor from 'braft-editor'
// 引入编辑器样式
import 'braft-editor/dist/index.css'

第二步:使用富文本编辑器

import React, { useState, forwardRef } from 'react'
import BraftEditor from 'braft-editor'
// 引入编辑器样式
import 'braft-editor/dist/index.css'

function NoConMaintenance(props, ref) {
  //富文本组件内容
   const [editorState, setEditorState] = useState<any>(BraftEditor.createEditorState('<p></p>'))
  //富文本输出的HTML
  const [outputHTML, setOutputHTML] = useState<any>('<p></p>')

  /**
   * @Author: YuKi
   * @description: 处理富文本框显示数据
   * @param {Object} editorState 富文本框内容
   * @return {*}
   */
  const handleEditorState = (editorState) => {
    setEditorState(editorState) //必须要有这一步
    setOutputHTML(editorState.toHTML()) //获取富文本框里面的内容
  }

  return (
    <>
      <BraftEditor
        className="my-editor"
        value={editorState}
        onChange={handleEditorState}
        contentStyle={{
          height: 210,
          boxShadow: 'inset 0 1px 3px rgba(0,0,0,.1)',
          border: '1px solid black',
        }}
      />
      <div>输出内容</div>
      <div>{outputHTML}</div>
    </>
  )
}

export default forwardRef(NoConMaintenance)

在这里插入图片描述
注意事项

1、富文本绑定的值editorState,初始化不能为空,需要配合BraftEditor.createEditorState()为其赋值<p></p>

2、富文本必须有onChange事件,事件中的参数是当前富文本框内的值,需要手动绑定一下setEditorState(editorState)

3、自定义内置组件

富文本使用 controls 属性指定需要展示的控件,在reactHooks+Ts项目中需要给controls设置any类型

  render () {
      const controls:any = [
      'undo', 'redo', 'separator',
      'font-size', 'line-height', 'letter-spacing', 'separator',
      'text-color', 'bold', 'italic', 'underline', 'strike-through', 'separator',
      'superscript', 'subscript', 'remove-styles', 'emoji', 'separator', 'text-indent', 'text-align', 'separator',
      'headings', 'list-ul', 'list-ol', 'blockquote', 'code', 'separator',
      'link', 'separator', 'hr', 'separator',
      'media',
      'separator',
      'clear'
    ]

    return (
      <div className="editor-wrapper">
        <BraftEditor
          controls={controls}
        />
      </div>
    )
  }

4、在Ant Design表单中使用

结合antd官方文档->Form->校验其他组件,采用如下两个属性

1、valuePropName组件绑定的值,类似于Form.Item中的name

2、getValueFromEvent是可以把自定义组件中的onChange 的参数(如 event)转化为控件的值,必须有返回值,返回的值就是Form.Item`组件值。
在这里插入图片描述
使用如下:

import React, { useState,forwardRef } from 'react'
import { Form} from 'antd'
import BraftEditor from 'braft-editor'
// 引入编辑器样式
import 'braft-editor/dist/index.css'

function NoConMaintenance(props, ref) {
  //表单的ref
  const [aEForm] = Form.useForm()
  //富文本组件内容
  const [editorState, setEditorState] = useState<any>(BraftEditor.createEditorState('<p></p>'))

  /**
   * @Author: YuKi
   * @description: 把自定义组件中的onChange 的参数(如 event)转化为控件的值
   * @param {any} e
   * @return {*}
   */  
  const normFile = (e: any) => {
    return e.toHTML()
  }

  /**
   * @Author: YuKi
   * @description: 处理富文本框显示数据
   * @param {Object} editorState
   * @return {*}
   */
  const handleEditorState = (editorState) => {
    setEditorState(editorState)
  }

  return (
    <>
      <Form
        name="aEfrom"
        labelCol={{ span: 22 }}
        wrapperCol={{ span: 22 }}
        autoComplete="off"
        form={aEForm}
        layout="vertical"
      >
        <Form.Item
          name="richText"
          label="富文本"
          valuePropName="richText"
          getValueFromEvent={normFile}
          rules={[{ required: true }]}
        >
          <BraftEditor
            className="my-editor"
            value={editorState}
            onChange={handleEditorState}
            contentStyle={{
              height: 210,
              boxShadow: 'inset 0 1px 3px rgba(0,0,0,.1)',
              border: '1px solid black',
            }}
          />
        </Form.Item>
      </Form>
    </>
  )
}

export default forwardRef(NoConMaintenance)

在这里插入图片描述

ps:如果需要回显数据,第一步用BraftEditor.createEditorState()为富文本进行赋值。第二步用From表单的ref,为From组件赋值

setEditorState(BraftEditor.createEditorState(record.noticeContent))
  aEForm.setFieldsValue({
    richText: record.noticeContent,
  })

5、集成Ant Design上传组件

以上传图片为例,braft-editor自带媒体上传,它自己会把图片转成base64,但是所占体积太大了。

解决方法:结合Ant Design的上传组件,先把图片上传到服务器上,然后把图片链接放到富文本里面

第一步:利用controls把媒体上传,去掉。

  /* 富文本自定义架构 */
  const controls: any = ['undo','redo','separator','font-size','line-height','letter-spacing',
'separator','text-color','bold','italic','underline', 'strike-through',
'separator','superscript','subscript','remove-styles','emoji','separator','text-indent','text-align',
'separator','headings','list-ul','list-ol','blockquote','code','separator','link','separator','hr',
'separator',// 'media','separator', 'clear',
  ]

第二步:采富文本extendControls属性自定义上传组件

    /**
   * @Author: YuKi
   * @description: 富文本上传图片前的勾子
   * @param {any} option
   * @return {*}
   */
     const beforeUpload = (file: RcFile) => {
      const isJpgOrPng =
        file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg'
      if (!isJpgOrPng) {
        message.error('You can only upload JPG、PNG、gif file!')
        return Upload.LIST_IGNORE
      }
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isLt2M) {
        message.error('Image must smaller than 2MB!')
        return Upload.LIST_IGNORE
      }
      return isJpgOrPng && isLt2M
    }
  
    /**
     * @Author: YuKi
     * @description: 富文本自定义自己图片的上传实现
     * @param {any} option
     * @return {*}
     */
    const handleUpload = (option: any) => {
      const formData = new FormData()
      formData.append('blobContainerName', 'NOTICE_FILE')
      formData.append('fileList', option.file)
      fileUpload(formData).then((rep: any) => {
        setEditorState(
          ContentUtils.insertMedias(editorState, [
            {
              type: 'IMAGE',
              url:
                'https://alphatest.blob.core.windows.net/' +
                `${rep.data[0].blobContainerName}/${rep.data[0].fileSaveName}`,
            },
          ]),
        )
      })
    }
    
   /*富文本自定义上传组件 */
  const extendControls: any = [
    {
      key: 'antd-uploader',
      type: 'component',
      component: (
        <Upload accept="image/*" showUploadList={false} beforeUpload={beforeUpload} customRequest={handleUpload}>
          {/* 富文本里面显示的按钮 */}
          <Button className="control-item button upload-button" data-title="上传图片">
            <PlusOutlined />
          </Button>
        </Upload>
      ),
    },
  ]

完整代码如下:

/*
 * @Description: 菜单路由配置文件
 * @Autor:
 * @LastEditors: YuKi
 * @Date: 2022/10/27 13:24:33
 * @LastEditTime: 2023/01/06
 */
import React from 'react'
import Layout from '@/layout'
import Login from '@/pages/Login'
import { RouterType } from '@/router/router.type'
import NoPage from '@/pages/NoPage'

/* 静态页路由 */
export const noPermission: RouterType[] = [
  {
    path: '/login',
    component: Login,
    exact: true,
    key: '/login',
    isShow: false,
  },
  {
    path: '/404',
    component: Layout,
    children: [
      {
        key: '404',
        component: NoPage,
        isShow: false,
      },
    ],
  },
]
/* 动态页路由 */
const routers: RouterType[] = [
  {
    path: '/',
    component: Layout,
    redirect: '/index/index',
    exact: true,
    key: '/',
    isShow: false,
  },
  // 首页
  {
    path: '/index/index',
    key: '/index',
    isShow: true,
    name: '首页',
    permissions: ['index'],
    component: Layout,
    icon: 'HomeOutlined',
    languageKey: 'menu.home',
    hideChildrenInMenu: false,
    breadcrumbName: '首页',
    children: [
      {
        name: '首页',
        languageKey: 'menu.home',
        key: '/index/index',
        path: '/index/index',
        icon: 'HomeOutlined',
        exact: true,
        isShow: true,
        breadcrumbName: '首页',
        permissions: ['index:index'],
        component: React.lazy(() => import('@/pages/Index')),
      },
    ],
  },
  /* 个人设置 */
  {
    path: '/personSettings',
    key: '/personSettings',
    isShow: false,
    name: '个人设置',
    icon: 'UserOutlined',
    languageKey: 'menu.personSettings',
    permissions: ['personSettings'],
    component: Layout,
    hideChildrenInMenu: false,
    breadcrumbName: '个人设置',
    children: [
      {
        name: '个人设置',
        key: '/personSettings/index',
        path: '/personSettings/index',
        exact: true,
        icon: 'UserOutlined',
        languageKey: 'menu.personSettings',
        breadcrumbName: '个人设置',
        isShow: false,
        permissions: ['personSettings:index'],
        component: React.lazy(() => import('@/pages/PersonalSettings')),
      },
    ],
  },
  /* 安规维护 */
  {
    path: '/safetyManage',
    key: '/safetyManage',
    isShow: true,
    name: '安规维护',
    permissions: ['safetyManage'],
    component: Layout,
    icon: 'SaveOutlined',
    languageKey: 'menu.safetyManage',
    hideChildrenInMenu: false,
    breadcrumbName: '安规维护',
    children: [
      {
        name: '安规维护',
        languageKey: 'menu.safetyManage',
        path: '/safetyManage',
        key: '/safetyManage',
        icon: 'SaveOutlined',
        exact: true,
        isShow: true,
        breadcrumbName: '安规维护',
        permissions: ['safetyManage:index'],
        component: React.lazy(() => import('@/pages/SafetyManage')),
      },
    ],
  },
  /* App维护 */
  {
    path: '/AppMaintenance',
    key: '/AppMaintenance',
    name: 'App维护',
    component: Layout,
    isShow: true,
    languageKey: 'menu.AppMaintenance',
    breadcrumbName: 'App维护',
    permissions: ['AppMaintenance'],
    icon: 'AppstoreOutlined',
    children: [
      /* APP欢迎页面维护 */
      {
        path: '/AppMaintenance/AppWelcomeMaintence',
        key: '/AppMaintenance/AppWelcomeMaintence',
        component: React.lazy(() => import('@/pages/AppMaintenance/AppWelcomeMaintence')),
        exact: true,
        name: 'APP欢迎页面维护',
        languageKey: 'menu.AppWelcomeMaintence',
        isShow: true,
        breadcrumbName: 'APP欢迎页面维护',
        permissions: ['AppMaintenance:AppMaintenance:AppWelcomeMaintence'],
      },
      /* APP版本维护 */
      {
        path: '/AppMaintenance/AppVersionMaintenance',
        key: '/AppMaintenance/AppVersionMaintenance',
        component: React.lazy(() => import('@/pages/AppMaintenance/AppVersionMaintenance')),
        exact: true,
        name: 'APP版本维护',
        languageKey: 'menu.AppVersionMaintenance',
        isShow: true,
        breadcrumbName: 'APP版本维护',
        permissions: ['AppMaintenance:AppMaintenance:AppVersionMaintenance'],
      },
    ],
  },
  /* 公司联系信息维护 */
  {
    path: '/companyContactInfoMaintenance',
    key: '/companyContactInfoMaintenance',
    isShow: true,
    name: '公司联系信息维护',
    permissions: ['companyContactInfoMaintenance'],
    component: Layout,
    icon: 'SnippetsOutlined',
    languageKey: 'menu.companyContactInfoMaintenance',
    hideChildrenInMenu: false,
    breadcrumbName: '公司联系信息维护',
    children: [
      {
        name: '公司联系信息维护',
        languageKey: 'menu.companyContactInfoMaintenance',
        path: '/companyContactInfoMaintenance',
        key: '/companyContactInfoMaintenance',
        icon: 'SnippetsOutlined',
        exact: true,
        isShow: true,
        breadcrumbName: '公司联系信息维护',
        permissions: ['companyContactInfoMaintenance:index'],
        component: React.lazy(() => import('@/pages/CompanyContactInfoMaintenance')),
      },
    ],
  },
  /*邮件模板管理*/
  {
    path: '/emailTemplate',
    key: '/emailTemplate',
    isShow: true,
    name: ' 邮件内容模板管理',
    icon: 'UsergroupDeleteOutlined',
    permissions: ['emailTemplate'],
    languageKey: 'menu.emailTemplate',
    component: Layout,
    hideChildrenInMenu: false,
    breadcrumbName: ' 邮件内容模板管理',
    children: [
      {
        name: ' 邮件内容模板管理',
        icon: 'UsergroupDeleteOutlined',
        key: '/emailTemplate/index',
        path: '/emailTemplate/index',
        exact: true,
        isShow: true,
        languageKey: 'menu.emailTemplate',
        breadcrumbName: ' 邮件内容模板管理',
        permissions: ['emailTemplate:index'],
        component: React.lazy(() => import('@/pages/EmailTemplate')),
      },
    ],
  },

  /*邮件内容管理*/
  {
    path: '/emailContentTemplate',
    key: '/emailContentTemplate',
    isShow: false,
    name: ' 邮件内容管理',
    icon: 'UsergroupDeleteOutlined',
    permissions: ['emailContentTemplate'],
    languageKey: 'menu.emailContentTemplate',
    component: Layout,
    hideChildrenInMenu: false,
    breadcrumbName: ' 邮件内容管理',
    children: [
      {
        name: ' 邮件内容模板管理',
        icon: 'UsergroupDeleteOutlined',
        key: '/emailContentTemplate/index',
        path: '/emailContentTemplate/index',
        exact: true,
        isShow: false,
        languageKey: 'menu.emailContentTemplate',
        breadcrumbName: ' 邮件内容模板管理',
        permissions: ['emailContentTemplate:index'],
        component: React.lazy(() => import('@/pages/EmailTemplate/EmailContentTemplate')),
      },
    ],
  },

  /* SAP管理模块 */
  {
    path: '/sapManage',
    key: '/sapManage',
    name: 'SPA管理',
    component: Layout,
    isShow: true,
    languageKey: 'menu.SAPManage',
    breadcrumbName: 'SPA管理',
    permissions: ['sapManage'],
    icon: 'MessageOutlined',
    children: [
      /* SAP接口配置管理 */
      {
        path: '/sapManage/sapApiManage',
        key: '/sapManage/sapApiManage',
        component: React.lazy(() => import('@/pages/SAPMaintenance/apiMaintenance')),
        exact: true,
        name: 'SAP接口配置管理',
        languageKey: 'menu.sapApiManage',
        isShow: true,
        breadcrumbName: 'SAP接口配置管理',
        permissions: ['sapManage:sapApiManage'],
      },
      /* SAP参数维护 */
      {
        path: '/sapManage/sapParamMaintain',
        key: '/sapManage/sapParamMaintain',
        component: React.lazy(() => import('@/pages/SAPMaintenance/paramsMaintenance')),
        exact: true,
        name: 'SAP参数维护',
        languageKey: 'menu.sapParamMaintain',
        isShow: true,
        breadcrumbName: 'SAP参数维护',
        permissions: ['sapManage:sapParamMaintain'],
      },
      /* SAP参数类别维护 */
      {
        path: '/sapManage/sapParamCateMain',
        key: '/sapManage/sapParamCateMain',
        component: React.lazy(() => import('@/pages/SAPMaintenance/paramsCateMaintenance')),
        exact: true,
        name: 'SAP参数类别维护',
        languageKey: 'menu.sapParamCateMain',
        isShow: true,
        breadcrumbName: 'SAP参数类别维护',
        permissions: ['sapManage:sapParamCateMain'],
      },
    ],
  },
  /*语言维护*/
  {
    path: '/languageMaintain/index',
    key: '/languageMaintain',
    isShow: true,
    name: '语言维护',
    icon: 'UsergroupDeleteOutlined',
    permissions: ['languageMaintain'],
    languageKey: 'menu.emailTemplate',
    component: Layout,
    hideChildrenInMenu: true,
    breadcrumbName: '语言维护',
    children: [
      {
        name: '语言维护',
        icon: 'UsergroupDeleteOutlined',
        key: '/languageMaintain/index',
        path: '/languageMaintain/index',
        exact: true,
        isShow: true,
        languageKey: 'menu.languageMaintain',
        breadcrumbName: '语言维护',
        permissions: ['languageMaintain:index'],
        component: React.lazy(() => import('@/pages/LanguageMaintain')),
      },
    ],
  },
  /*太阳辐射显示维护*/
  {
    path: '/sunRadiation/index',
    key: '/sunRadiation',
    isShow: true,
    name: '太阳辐射显示维护',
    icon: 'UsergroupDeleteOutlined',
    permissions: ['sunRadiation'],
    languageKey: 'menu.sunRadiation',
    component: Layout,
    hideChildrenInMenu: true,
    breadcrumbName: '太阳辐射显示维护',
    children: [
      {
        name: '太阳辐射显示维护',
        icon: 'UsergroupDeleteOutlined',
        key: '/sunRadiation/index',
        path: '/sunRadiation/index',
        exact: true,
        isShow: true,
        languageKey: 'menu.sunRadiation',
        breadcrumbName: '太阳辐射显示维护',
        permissions: ['sunRadiation:index'],
        component: React.lazy(() => import('@/pages/SunRadiation/index')),
      },
    ],
  },
  /*第三方平台维护*/
  {
    path: '/platMaintenance/index',
    key: '/platMaintenance',
    isShow: true,
    name: '第三方平台维护',
    icon: 'UsergroupDeleteOutlined',
    permissions: ['platMaintenance'],
    languageKey: 'menu.platMaintenance',
    component: Layout,
    hideChildrenInMenu: true,
    breadcrumbName: '第三方平台维护',
    children: [
      {
        name: '第三方平台维护',
        icon: 'UsergroupDeleteOutlined',
        key: '/platMaintenance/index',
        path: '/platMaintenance/index',
        exact: true,
        isShow: true,
        languageKey: 'menu.platMaintenance',
        breadcrumbName: '第三方平台维护',
        permissions: ['platMaintenance:index'],
        component: React.lazy(() => import('@/pages/ThirdPlatMaintenance')),
      },
    ],
  },
  /* 站内消息维护 */
  {
    path: '/siteMesMaintenance',
    key: '/siteMesMaintenance',
    name: '站内消息维护',
    component: Layout,
    isShow: true,
    languageKey: 'menu.siteMesMaintenance',
    breadcrumbName: '站内消息维护',
    permissions: ['siteMesMaintenance'],
    icon: 'MessageOutlined',
    children: [
      /* 通知类型维护 */
      {
        path: '/siteMesMaintenance/templateMaintenance',
        key: '/siteMesMaintenance/templateMaintenance',
        component: React.lazy(() => import('@/pages/SiteMesMaintenance/TemplateMaintenance')),
        exact: true,
        name: '通知类型维护',
        languageKey: 'menu.templateMaintenance',
        isShow: true,
        breadcrumbName: '通知类型维护',
        permissions: ['siteMesMaintenance:templateMaintenance'],
      },
      /* 通知模板维护 */
      {
        path: '/siteMesMaintenance/typeMaintenance',
        key: '/siteMesMaintenance/typeMaintenance',
        component: React.lazy(() => import('@/pages/SiteMesMaintenance/TypeMaintenance')),
        exact: true,
        name: '通知模板维护',
        languageKey: 'menu.typeMaintenance',
        isShow: true,
        breadcrumbName: '通知模板维护',
        permissions: ['siteMesMaintenance:typeMaintenance'],
      },
    ],
  },
  /*通知对象维护*/
  {
    path: '/noObjMaintenance',
    key: '/noObjMaintenance',
    isShow: false,
    name: ' 通知对象维护',
    permissions: ['noObjMaintenance'],
    languageKey: 'menu.noObjMaintenance',
    component: Layout,
    hideChildrenInMenu: false,
    breadcrumbName: ' 通知对象维护',
    children: [
      {
        name: ' 通知对象维护',
        key: '/noObjMaintenance/index',
        path: '/noObjMaintenance/index',
        exact: true,
        isShow: false,
        languageKey: 'menu.noObjMaintenance',
        breadcrumbName: ' 通知对象维护',
        permissions: ['noObjMaintenance:index'],
        component: React.lazy(() => import('@/pages/SiteMesMaintenance/TypeMaintenance/components/NoObjMaintenance')),
      },
    ],
  },
  /*通知内容维护*/
  {
    path: '/noConMaintenance',
    key: '/noConMaintenance',
    isShow: false,
    name: ' 通知内容维护',
    permissions: ['noConMaintenance'],
    languageKey: 'menu.noConMaintenance',
    component: Layout,
    hideChildrenInMenu: false,
    breadcrumbName: ' 通知内容维护',
    children: [
      {
        name: ' 通知内容维护',
        key: '/noConMaintenance/index',
        path: '/noConMaintenance/index',
        exact: true,
        isShow: false,
        languageKey: 'menu.noConMaintenance',
        breadcrumbName: ' 通知内容维护',
        permissions: ['noConMaintenance:index'],
        component: React.lazy(() => import('@/pages/SiteMesMaintenance/TypeMaintenance/components/NoConMaintenance')),
      },
    ],
  },
  /* 用户协议维护 */
  {
    path: '/userAgreementMaintenance',
    key: '/userAgreementMaintenance',
    isShow: true,
    name: '用户协议维护',
    permissions: ['userAgreementMaintenance'],
    component: Layout,
    icon: 'SnippetsOutlined',
    languageKey: 'menu.userAgreementMaintenance',
    hideChildrenInMenu: false,
    breadcrumbName: '用户协议维护',
    children: [
      {
        name: '用户协议维护',
        languageKey: 'menu.userAgreementMaintenance',
        path: '/userAgreementMaintenance/index',
        key: '/userAgreementMaintenance/index',
        icon: 'SnippetsOutlined',
        exact: true,
        isShow: true,
        breadcrumbName: '用户协议维护',
        permissions: ['userAgreementMaintenance:index'],
        component: React.lazy(() => import('@/pages/UserAgreementMaintenance')),
      },
    ],
  },
  /* 字典维护 */
  {
    path: '/dictionaryMaintenance',
    key: '/dictionaryMaintenance',
    isShow: true,
    name: '字典维护',
    permissions: ['dictionaryMaintenance'],
    component: Layout,
    icon: 'SnippetsOutlined',
    languageKey: 'menu.dictionaryMaintenance',
    hideChildrenInMenu: false,
    breadcrumbName: '字典维护',
    children: [
      {
        name: '字典维护',
        languageKey: 'menu.dictionaryMaintenance',
        path: '/dictionaryMaintenance/index',
        key: '/dictionaryMaintenance/index',
        icon: 'SnippetsOutlined',
        exact: true,
        isShow: true,
        breadcrumbName: '字典维护',
        permissions: ['dictionaryMaintenance:index'],
        component: React.lazy(() => import('@/pages/DictionaryMaintenance')),
      },
      {
        name: '内容维护',
        languageKey: 'menu.contentRepair',
        path: '/dictionaryMaintenance/contentRepair/index',
        key: '/dictionaryMaintenance/contentRepair/index',
        icon: 'SnippetsOutlined',
        exact: true,
        isShow: false,
        breadcrumbName: '内容维护',
        permissions: ['contentRepair:index'],
        component: React.lazy(() => import('@/pages/DictionaryMaintenance/contentRepair')),
      },
    ],
  },
  ...noPermission,
]

export default routers

在这里插入图片描述

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

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

相关文章

FGH60N60SMD 60A600V IGBT单管在工业逆变应用中的解决方案

场截止IGBT单管 60A600V FGH60N60SMD 采用新型场截止 IGBT 技术&#xff0c;为太阳能逆变器、UPS、焊接机、电信、ESS 和 PFC 等低导通和开关损耗至关重要的应用。 ONsemi安森美IGBT单管系列&#xff1a; FGH40N60SMD FGH60N60SMD FGH75T65SHD-F155 NGTB40N120FL2WG特性&…

基于pytorch的CREStereo立体匹配算法

文章目录前言一、CREStereo是什么&#xff1f;1.自适应群相关层局部特征注意力2D-1D转换局部搜索可变形的搜索窗口Group-wise相关性2.级联的网络3.叠加级联推理4.叠加级联推理损失函数二、基于pytorch的CREStereo立体匹配算法前言 CREStereo目前在middlebury上的排名第三&#…

Java高手速成 | Spring、JPA与Hibernate的整合

01、设置Spring的配置文件 在Spring的配置文件applicationContext.xml中&#xff0c;配置C3P0数据源、EntityManagerFactory和JpaTransactionManager等Bean组件。以下是applicationContext.xml文件的源程序。 /* applicationContext.xml */ <?xml version"1.0" …

【财务】FMS财务管理系统---审计流程

本文是电商系列的终结篇&#xff0c;笔者在本文介绍了审计流程及注意事项。 本篇是介绍财务审计的&#xff0c;作为电商系列的终结篇。后续计划去完成供应链后台的相关系统的梳理与学习&#xff0c;非常感谢朋友们在阅读过程中提出的问题与建议。 一、审计及流程 财务审计是每…

吴晓波年终秀原版PPT下载

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点2023年&#xff0c;如何科学制定年度规划&#xff1f;罗振宇2023年跨年演讲PPT原稿《底层逻辑》高清配图清华大学256页PPT元宇宙研究报告.pdf&#x…

nginx学习笔记2(小d课堂)

nginx目录文件讲解&#xff1a; 我们这里要去了解我们画红框了的这四个目录。 我们一般只用这两个文件&#xff0c;nginx.conf.default是nginx的默认模板。 我们先来看看这个默认模板&#xff1a; 这里面会有特别多的配置&#xff0c;我们后面的课会去学到。我们可能以后改哪个…

【实战篇】37 # 如何使用 QCharts 图表库绘制常用数据图表?

说明 【跟月影学可视化】学习笔记。 QCharts 图表库 QCharts 是一个基于 spritejs 封装的图表库&#xff0c;可以让用户以组件的形式组合出各种图表&#xff1a;https://www.qcharts.cn/#/home QCharts 图表的基本用法 最简单的方式是&#xff0c;直接通过 CDN&#xff0c;…

Mac 几款不错的文件管理工具

Default Folder X 文件快捷访问工具 Default Folder X V6.9d19 是一款 Mac 上的文件夹快捷访问工具&#xff0c;您可以访问您最近的&#xff0c;最喜欢的&#xff0c;并打开文件夹的默认文件夹X的工具栏右侧的内容。扩大你把鼠标移到他们的层次弹出菜单&#xff0c;让您浏览您…

【胖虎的逆向之路】动态加载和类加载机制详解

胖虎的逆向之路 —— 动态加载和类加载机制详解一、前言二、类的加载器1. 双亲委派模式2. Android 中的类加载机制1&#xff09;Android 基本类的预加载2&#xff09;Android类加载器层级关系及分析3&#xff09;BootClassLoader4&#xff09;Class文件加载5&#xff09;PathCl…

从 Redshift 迁移数据到 DolphinDB

AWS Redshift 是最早的云数据仓库之一&#xff0c;为用户提供完全托管的 PB 级云中数据仓库服务。用户可以使用标准 SQL 和现有的商业智能工具&#xff0c;经济高效地进行数据分析。但 AWS Redshift 上手难度较大&#xff0c;对知识储备要求较高&#xff0c;设计和优化相当复杂…

PCB设计中的屏蔽罩设计

屏蔽罩是一个合金金属罩&#xff0c;是减少显示器辐射至关重要的部件&#xff0c;应用在MID或VR产品中可以有效的减少模块与模块之间的相互干扰&#xff0c;如图3-54所示&#xff0c;常见于主控功能模块和电源模块及Wifi模块之间的隔离。图3-54 屏蔽罩的使用 01 屏蔽罩夹子一般…

前端沙箱浅析

前言 沙箱&#xff0c;即sandbox。 通常解释为&#xff1a;沙箱是一种安全机制&#xff0c;为运行中的程序提供隔离环境。常用于执行未经测试或者不受信任的程序或代码&#xff0c;它会为待执行的程序创建一个独立的执行环境&#xff0c;内部程序的执行不会影响外部程序的运行…

Go第 7 章:数组与切片

Go第 7 章&#xff1a;数组与切片 7.1 为什么需要数组 7.2 数组介绍 数组可以存放多个同一类型数据。数组也是一种数据类型&#xff0c;在 Go 中&#xff0c;数组是值类型。 7.3 数组的快速入门 我们使用数组的方法来解决养鸡场的问题. 7.4 数组定义和内存布局 对上图的总…

QA | 关于信号发生器的扫频功能,您了解多少?

在上期文章中&#xff0c;我们介绍了可编程信号发生器使用中的相关问题&#xff0c;那么关于便携式信号发生器的扫频功能您是否有很多问题呢&#xff0c;今天我们将围绕信号源扫频功能详细解答大家感兴趣的几个问题&#xff0c;快来看看吧&#xff01;Q1&#xff1a;信号源是否…

Linux操作系统--文件管理(保姆级教程)

文件系统类型的含义 文件系统类型式指文件在存储介质上存放及存储的组织方法和数据结构。 Linux采用虚拟文件系统技术&#xff08;virtual file system)-VFS 一个世纪的文件系统想要被Linux支持&#xff0c;就必须提供一个符合VFS标准的接口&#xff0c;才能与VFS协同工作&am…

线程的创建与同步

线程的创建与同步线程的概念与实现方式线程的概念进程线程的区别线程使用线程相关的接口函数多线程代码线程并发线程的实现方式线程的同步信号量互斥锁读写锁条件变量线程的安全线程与fork线程的概念与实现方式 线程的概念 进程是正在执行的程序。线程是进程内部的一条执行路…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《4》

这篇主要了解语义分割(semantic segmentation)&#xff0c;语义分割是分类中的一个核心知识点&#xff0c;而且这些语义区域的标注和预测都是像素级的。在语义分割中有两个很相似的重要问题&#xff0c;需要注意下&#xff1a;图像分割(image segmentation)&#xff1a;将图像分…

一文解决用C语言实现一个链表(全都是细节)

目录前言单链表1.链表中的结点2.链表中的常见操作&#xff08;1&#xff09;相关声明格式&#xff08;2&#xff09;常见操作的实现&#xff08;定义&#xff09;&#xff08;5&#xff09;测试前言 链表是指数据使用一个一个的结点连接起来的数据结构&#xff0c;这样的数据结…

(框架)Deepracer Local - 001: 搭建本地环境

Deepracer - 阿里云1. 安装环境2. 预安装脚本3. 从 github 下载 deepracer 代码 并初始化4. 首次运行deepracer1. 安装环境 推荐本地环境: Ubuntu (如果windowns必要的话&#xff0c;就装双系统&#xff0c;我的台式机就是双系统) 云环境: 阿里云&#xff0c;配置如下&#xf…

python简单介绍及基础知识(二)

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…