【jQuery】js实现文件浏览功能

news2024/11/28 22:53:32

1.说明

近期遇到一个浏览用户文件的需求,类似于访问百度网盘那样的列表,包含文件和文件夹,这个功能实现起来很简单,从服务器获取到的文件列表至少要有文件id、父级文件id、是否文件夹这三个字段

2.html设计

前端排版看你实际情况设计,我这里只简单展示文件夹和文件夹以及对应的图表就行,文件时间等其他信息也可以自行展示。我这里使用table标签展示文件列表,每一个文件都是一个tr,效果如下
在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
    <script src="http://cdn.staticfile.org/jquery/2.0.0/jquery.min.js"></script>
</head>
<style>
    #explorerContainer {
        width: 800px;
        margin: 0 auto;
        /* display: none; */
    }

    .fileIco {
        width: 32px;
        height: 32px;
    }

    .fileRow {
        width: 550px;
        border-bottom: 1px solid #a75318;
        line-height: 50px;
        align-items: center;
        padding: 0 20px;
        margin-left: 110px;
    }

    .fileRow span {
        height: 32px;
        line-height: 32px;
    }

    .fileRow span {
        margin: 0 10px;
    }

    .fileRow span a {
        color: #582a0a;
    }
</style>

<body>
    <div id="explorerContainer">
        <table>
            <tbody>
                <tr>
                    <td>
                        <div class="fileRow">
                            <span><a href="" id="upperLevel">上一级...</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="folder.png" alt="" class="fileIco">
                            <span><a href="">新建文件夹1</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="folder.png" alt="" class="fileIco">
                            <span><a href="javascript:void(0);">新建文件夹2</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="exe.png" alt="" class="fileIco">
                            <span><a href="">测试文件.exe</a></span>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</body>

</html>

3.展示文件列表

样式设置好之后,我们先试着展示固定的文件,文件保存在一个数组中,每一个文件都有文件id,我这里使用文件路径代替,只要是唯一的就行,所以这里的每一个文件对象都有path、parent_path、isdir这三个属性,分别表示文件路径、父级文件路径、是否文件夹

let upperLevelPath = ""
let files = [
    {
        "category": 6,
        "fs_id": 934435682367559,
        "isdir": 1,
        "local_ctime": 1621308615,
        "local_mtime": 1621308615,
        "path": "/sharelink0-480654963977751/3dsmax/3dmax2022",
        "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
        "server_ctime": 1621308615,
        "server_filename": "3dmax2022",
        "server_mtime": 1644238064,
        "size": 0
    },
    {
        "category": 5,
        "fs_id": 517879331580918,
        "isdir": 0,
        "local_ctime": 1521869688,
        "local_mtime": 1521869688,
        "md5": "2a5f6be1bbc6d24fc172e887ed424604",
        "path": "/sharelink3073240792-480654963977751/3dsmax/Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_001_003.sfx.exe",
        "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
        "server_ctime": 1521869688,
        "server_filename": "Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_001_003.sfx.exe",
        "server_mtime": 1561784982,
        "size": 2115408424
    },
    ...
]

再写一个函数遍历files文件数组,拼凑DOM展示,不过要注意“上一级”按钮要特别处理,虽然它应该具有文件夹的功能,但是它是一个特殊的文件夹

let upperLevelPath = ""
function showFiles(tempList, parent_path) {
    let tbody = $('<tbody><tr><td> <div class="fileRow"><span><a href="javascript:void(0);" path="' + upperLevelPath + '" id="upperLevel">上一级...</a></span></div></td></tr></tbody>')
    for (var i = 0, len = tempList.length; i < len; i++) {
        if (tempList[i].parent_path == parent_path) {
            let img = $('<img alt="" class="fileIco">')
            if (tempList[i].isdir == 1) {
                img.attr("src", 'folder.png')
            } else {
                img.attr("src", "exe.png")
            }
            let span = $('<span><a href="javascript:void(0);" path="' + tempList[i].path + '" parent_path="' + tempList[i].parent_path + '" is_dir=' + tempList[i].isdir + ' fs_id=' + tempList[i].fs_id + ' >' + tempList[i].server_filename + '</a></span>')
            let fileRowDiv = $('<div class="fileRow"></div>')
            fileRowDiv.append(img)
            fileRowDiv.append(span)
            if (tempList[i].isdir == 0) {
                fileRowDiv.append($('<div id="rlink_div_' + tempList[i].fs_id + '"></div>'))
            }
            tbody.append($('<tr><td>' + fileRowDiv[0].outerHTML + '</td></tr>'))
        }
    }
    $('tbody').empty()
    $('tbody').append(tbody)

}

showFiles(files, "/sharelink3073240792-480654963977751/3dsmax")

再来看一下效果
在这里插入图片描述

4.浏览文件

文件列表可以从服务器获取,获取之后调用showFiles()进行出来,但还不具备点击功能,比如说点击文件夹应该展示该文件夹里的文件。当点击进入某个文件夹的时候记录一下它的父级路径,保存到“上一级”按钮,当要返回上一级的时候就很方便了,但是,如果还要再上一级,这时候就没办法了,不过,只能获取子文件的上级然后在文件列表里找到父级的父级,不用担心上级文件夹为空,因为能连进两级,那父级不必不为空。当点击了文件或文件夹,如果在文件列表里找不到它的子集了,这时候可以发起从服务器获取的请求,当然,应该先判断一下是否已经存在文件列表了,如果已经存在就不需要再次发起请求。
所以监听点击文件的方法也很容易写出来

function monitorFileClick() {
    $('.fileRow span a').click(function () {
        let path = $(this).attr("path")
        let id_ = $(this).attr("id")

        if (id_ == "upperLevel") {
            if (!upperLevelPath) {
                lastPath = $(".fileRow span a").last().attr("parent_path")
                console.log('lastPath:', lastPath)
                if (!lastPath) {
                    alert("没有上一级了哦")
                    return
                }
                for (var i = files.length - 1; i >= 0; i--) {
                    if (files[i].path == lastPath && files[i].parent_path) {
                        upperLevelPath = files[i].parent_path
                        break
                    }
                }
                if (!upperLevelPath) {
                    alert("没有上一级了啦啦啦啦啦")
                    return
                }
            }
            showFiles(files, upperLevelPath)
            upperLevelPath = ""
        } else {
            if ($(this).attr('is_dir') == 1) {
                let isIn = isInTempList(files, path)
                if (!isIn) {
                    alert("点击了文件夹,发起请求")
                }
                if ($(this).attr("parent_path")) {
                    upperLevelPath = $(this).attr("parent_path")
                }
                showFiles(files, path)
            } else {
                console.log("这不是文件夹")
                if ($(this).attr("isSuccess") == 1) {
                    return
                }
                alert("请求文件")
            }
        }
    })
}

function isInTempList(tempList, path) {
    console.log("isInTempList()", tempList.length, path)
    for (var i = 0, len = tempList.length; i < len; i++) {
        if (tempList[i].parent_path == path) {
            return true
        }
    }
    return false
}

什么时候调用这个方法呢?当然是展示完列表就调用

function showFiles(tempList, parent_path) {
    ...
    $('tbody').empty()
    $('tbody').append(tbody)

    monitorFileClick()
}

5.完整代码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
    <script src="http://cdn.staticfile.org/jquery/2.0.0/jquery.min.js"></script>
</head>
<style>
    #explorerContainer {
        width: 800px;
        margin: 0 auto;
        /* display: none; */
    }

    .fileIco {
        width: 32px;
        height: 32px;
    }

    .fileRow {
        width: 550px;
        border-bottom: 1px solid #a75318;
        line-height: 50px;
        align-items: center;
        padding: 0 20px;
        margin-left: 110px;
    }

    .fileRow span {
        height: 32px;
        line-height: 32px;
    }

    .fileRow span {
        margin: 0 10px;
    }

    .fileRow span a {
        color: #582a0a;
    }
</style>

<body>
    <div id="explorerContainer">
        <table>
            <tbody>
                <tr>
                    <td>
                        <div class="fileRow">
                            <span><a href="" id="upperLevel">上一级...</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="folder.png" alt="" class="fileIco">
                            <span><a href="">新建文件夹1</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="folder.png" alt="" class="fileIco">
                            <span><a href="javascript:void(0);">新建文件夹2</a></span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div class="fileRow">
                            <img src="exe.png" alt="" class="fileIco">
                            <span><a href="">测试文件.exe</a></span>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
<script>
    let upperLevelPath = ""
    let files = [
        {
            "category": 6,
            "fs_id": 934435682367559,
            "isdir": 1,
            "local_ctime": 1621308615,
            "local_mtime": 1621308615,
            "path": "/sharelink0-480654963977751/3dsmax/3dmax2022",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1621308615,
            "server_filename": "3dmax2022",
            "server_mtime": 1644238064,
            "size": 0
        },
        {
            "category": 5,
            "fs_id": 830937815955136,
            "isdir": 0,
            "local_ctime": 1521869699,
            "local_mtime": 1521869699,
            "md5": "a79f60762a81dba8fd806233e9941900",
            "path": "/sharelink3073240792-480654963977751/3dsmax/Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_003_003.sfx.exe",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1521869699,
            "server_filename": "Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_003_003.sfx.exe",
            "server_mtime": 1561784982,
            "size": 450021000
        },
        {
            "category": 5,
            "fs_id": 92781334838182,
            "isdir": 0,
            "local_ctime": 1521869691,
            "local_mtime": 1521869691,
            "md5": "4de7ffe1ca87511b599aa60a0bce4a24",
            "path": "/sharelink3073240792-480654963977751/3dsmax/Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_002_003.sfx.exe",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1521869691,
            "server_filename": "Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_002_003.sfx.exe",
            "server_mtime": 1561784982,
            "size": 2115408424
        },
        {
            "category": 5,
            "fs_id": 517879331580918,
            "isdir": 0,
            "local_ctime": 1521869688,
            "local_mtime": 1521869688,
            "md5": "2a5f6be1bbc6d24fc172e887ed424604",
            "path": "/sharelink3073240792-480654963977751/3dsmax/Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_001_003.sfx.exe",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1521869688,
            "server_filename": "Autodesk_3ds_Max_2019_EFGJKPS_Win_64bit_001_003.sfx.exe",
            "server_mtime": 1561784982,
            "size": 2115408424
        },
        {
            "category": 6,
            "fs_id": 381680330545337,
            "isdir": 0,
            "local_ctime": 1561785049,
            "local_mtime": 1561785036,
            "md5": "9afb7d34ac26ead6b7435421c7bd5014",
            "path": "/sharelink3073240792-480654963977751/3dsmax/3dsmax2019zhuceji.zip",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1561785049,
            "server_filename": "3dsmax2019zhuceji.zip",
            "server_mtime": 1561785049,
            "size": 2044074
        },
        {
            "category": 6,
            "fs_id": 934435682367559,
            "isdir": 1,
            "local_ctime": 1621308615,
            "local_mtime": 1621308615,
            "path": "/sharelink0-480654963977751/3dsmax/test",
            "parent_path": "/sharelink0-480654963977751/3dsmax/3dmax2022",
            "server_ctime": 1621308615,
            "server_filename": "test",
            "server_mtime": 1644238064,
            "size": 0
        },
        {
            "category": 6,
            "fs_id": 934435682367559,
            "isdir": 1,
            "local_ctime": 1621308615,
            "local_mtime": 1621308615,
            "path": "/sharelink0-480654963977751/3dsmax/3dmax2023",
            "parent_path": "/sharelink3073240792-480654963977751/3dsmax",
            "server_ctime": 1621308615,
            "server_filename": "3dmax2023",
            "server_mtime": 1644238064,
            "size": 0
        },
        {
            "category": 6,
            "fs_id": 934435682367559,
            "isdir": 0,
            "local_ctime": 1621308615,
            "local_mtime": 1621308615,
            "path": "/sharelink0-480654963977751/3dsmax/3dmax2023/test",
            "parent_path": "/sharelink0-480654963977751/3dsmax/3dmax2023",
            "server_ctime": 1621308615,
            "server_filename": "3dmax2023test",
            "server_mtime": 1644238064,
            "size": 0
        },

    ]

    function showFiles(tempList, parent_path) {
        let tbody = $('<tbody><tr><td> <div class="fileRow"><span><a href="javascript:void(0);" path="' + upperLevelPath + '" id="upperLevel">上一级...</a></span></div></td></tr></tbody>')
        for (var i = 0, len = tempList.length; i < len; i++) {
            if (tempList[i].parent_path == parent_path) {
                let img = $('<img alt="" class="fileIco">')
                if (tempList[i].isdir == 1) {
                    img.attr("src", 'folder.png')
                } else {
                    img.attr("src", "exe.png")
                }
                let span = $('<span><a href="javascript:void(0);" path="' + tempList[i].path + '" parent_path="' + tempList[i].parent_path + '" is_dir=' + tempList[i].isdir + ' fs_id=' + tempList[i].fs_id + ' >' + tempList[i].server_filename + '</a></span>')
                let fileRowDiv = $('<div class="fileRow"></div>')
                fileRowDiv.append(img)
                fileRowDiv.append(span)
                if (tempList[i].isdir == 0) {
                    fileRowDiv.append($('<div id="rlink_div_' + tempList[i].fs_id + '"></div>'))
                }
                tbody.append($('<tr><td>' + fileRowDiv[0].outerHTML + '</td></tr>'))
            }
        }
        $('tbody').empty()
        $('tbody').append(tbody)

        monitorFileClick()

    }
    function isInTempList(tempList, path) {
        console.log("isInTempList()", tempList.length, path)
        for (var i = 0, len = tempList.length; i < len; i++) {
            if (tempList[i].parent_path == path) {
                return true
            }
        }
        return false
    }

    showFiles(files, "/sharelink3073240792-480654963977751/3dsmax")

    function monitorFileClick() {
        $('.fileRow span a').click(function () {
            let path = $(this).attr("path")
            let id_ = $(this).attr("id")

            if (id_ == "upperLevel") {
                if (!upperLevelPath) {
                    lastPath = $(".fileRow span a").last().attr("parent_path")
                    console.log('lastPath:', lastPath)
                    if (!lastPath) {
                        alert("没有上一级了哦")
                        return
                    }
                    for (var i = files.length - 1; i >= 0; i--) {
                        if (files[i].path == lastPath && files[i].parent_path) {
                            upperLevelPath = files[i].parent_path
                            break
                        }
                    }
                    if (!upperLevelPath) {
                        alert("没有上一级了啦啦啦啦啦")
                        return
                    }
                }
                showFiles(files, upperLevelPath)
                upperLevelPath = ""
            } else {
                if ($(this).attr('is_dir') == 1) {
                    let isIn = isInTempList(files, path)
                    if (!isIn) {
                        alert("点击了文件夹,发起请求")
                    }
                    if ($(this).attr("parent_path")) {
                        upperLevelPath = $(this).attr("parent_path")
                    }
                    showFiles(files, path)
                } else {
                    console.log("这不是文件夹")
                    if ($(this).attr("isSuccess") == 1) {
                        return
                    }
                    alert("请求文件")
                }
            }
        })
    }
</script>

</html>

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

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

相关文章

x86架构设备的OpenWrt的空间扩容问题

openwrt固件是squashfs-combined-efi非exf4格式 直接将原有根分区扩容 用插件是&#xff1a;fdisk,losetup,resize2fs,blkid df -h fdisk -l fdisk /dev/sda //进入fdisk分区管理工具注意fdisk后参数是磁盘名称&#xff0c;是要根据实际情况填写 fdisk /dev/sda //进入fdi…

【04-JVM面试专题-什么是双亲委派机制(父类委托机制)?如何打破双亲委派机制?双亲委派机制的优缺点?什么是沙箱安全机制呢?】

什么是双亲委派机制&#xff1f;如何打破双亲委派机制&#xff1f; JVM的双亲委派机制知道吗&#xff1f;怎么打破它呢&#xff1f;你看看自己掌握的怎么样呢&#xff1f; 什么是双亲委派机制&#xff1f;(父类委托机制) 检查某个类是否已经加载 自底向上&#xff0c;从Custom…

将数组中的每个元素四舍五入到指定的精度numpy.rint()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中的每个元素 四舍五入到指定的精度 numpy.rint() 选择题 请问np.rint(a)的输出结果是? import numpy as np anp.array([-1.72,-1.3,0.37,2.4]) print("【显示】a&#xff1a;\n…

requests库基本用法

目录 1 GET请求 1.1 无参数 1.2 查询字符串 2 POST 2.1 无参数 2.2 json数据 2.3 文件 3 一些常见的请求 3.1 base64 requests是请求用的&#xff0c;在发起请求中requests会默认帮我们解决一些问题&#xff0c;比如跨域 下面做几个例子&#xff0c;服务选用…

CTFer成长之路之SSRF漏洞

SSRF漏洞CTF SSRF Training 题目描述: web容器中存在一个flag&#xff0c;mysql中存在一个管理员账号密码&#xff0c;其余容器中均没有特定flag mysql容器中内置 tcpdump vulnweb容器中内置一个 fpm.py 攻击脚本 docker-compose.yml version: "3" services:w…

有色金属行业数字化之路探析

有色金属行业是我国国民经济的支柱产业和重要组成部分&#xff0c;是处于整个原材料生产链的上游环节&#xff0c;其支撑着冶炼、钢铁、智能制造业、芯片、建筑等行业的发展&#xff0c;也是是科学研究、国防建设等方面发展的重要材料基础&#xff0c;同时还是保障国家综合实力…

Linux之安装node

Linux之安装node步骤如下 1.去网站下载node 下载地址&#xff1a; https://npm.taobao.org/mirrors/ 2.上传到指定目录下 3.解压 tar -zxvf node-v17.3.0-linux-x644.配置node环境变量 //执行以下命令 vim /etc/profile //在path中加入以下内容 /usr/local/node-v15.14.0/b…

电力电子系统仿真软件--Psim仿真软件设计

目录 1.简介 2.应用优势 3.应用领域 4.电路结构 5.界面介绍 6.应用实例 6.1 主电路部分 6.2 控制电路部分 6.3 具体的电路原理及仿真搭建过程后续会一一介绍&#xff0c;请各位点赞关注&#xff0c;你的关注将是博主最大的更新动力。 7.电力系统仿真软件下载链接 1.简…

以萨技术在科创板IPO终止:计划募资15亿元,实控人为李凡平

2月21日&#xff0c;上海证券交易所披露的信息显示&#xff0c;因以萨技术股份有限公司&#xff08;下称“以萨技术”&#xff09;及其保荐人撤回发行上市申请&#xff0c;根据《上海证券交易所股票发行上市审核规则》第六十三条的相关规定&#xff0c;上海证券交易所终止其发行…

创业能否成功?这几个因素很重要!

创业能否成功&#xff1f;这几个因素很重要&#xff01; 2023-02-22 19:06:53 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 上周末跟朋友一起钓鱼&#xff0c;他跟吐槽现在生意越来越难做。他是我身边可以说是创业很成功的例子&#…

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性&#xff0c;就好像我们在做股票投资的时候&#xff0c;提到最多的就是周期规律&#xff0c;因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…

初探 qiling ( 麒麟 ):开源的二进制分析、高级代码模拟框架

官方介绍&#xff1a; 官网&#xff1a;https://qiling.io/&#xff1a;https://twitter.com/qiling_iogithub 地址&#xff1a;https://github.com/qilingframework/qiling 1、qiling 简介 qiling 是什么 qiling 基于 python 开发&#xff0c;是一个开源的、可模拟多种架构…

Vue3 基础

Vue3 基础 概述 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&…

升职加薪必备,2023年程序员不能不知道的AI辅助编码工具

已经有很多人把chatGPT当做必备的Bug修复工具了&#xff0c;对于用AI写代码&#xff0c;有人感到失落&#xff0c;害怕被取代&#xff0c;而另一些人则认为人工智能将加快编写更好代码的过程。 尽管 AI 编写的代码并非完美无缺&#xff0c;但我相信&#xff0c;最终AI将取代人…

Java实例——网络实例

1、主机IP地址获取 步骤一&#xff1a;获取主机InetAddress 步骤二&#xff1a;获取主机IP地址 InetAddress address null;try {address InetAddress.getByName("www.baidu.com");}catch (UnknownHostException e) {System.exit(2);}System.out.println("Host…

聚类(性能度量)

文章目录聚类&#xff08;性能度量&#xff09;外部指标例1内部指标例2聚类&#xff08;性能度量&#xff09; 对数据集 D{x1,x2,...,xm}D\{x_1,x_2,...,x_m\}D{x1​,x2​,...,xm​} &#xff0c;假定通过聚类给出的簇划分为 C{C1,C2,...,Ck}C\{C_1,C_2,...,C_k\}C{C1​,C2​,…

计算机组成原理错题

静态RAM&#xff08;SRAM&#xff09;和动态RAM&#xff08;DRAM&#xff09;的基本电路图不同&#xff0c;因此可以通过观察存储器的基本电路图来判断它属于哪一类。 静态RAM的基本电路图包括一个存储单元和一个数据选择器。每个存储单元由一个触发器&#xff08;flip-flop&a…

汽车零部件企业数字工厂管理系统建设方案

在汽车零部件制造领域&#xff0c;伴随工业信息化与机器人化&#xff0c;制造模式逐渐从 CAD/CAE/CAM 数字化设计及加工走向全产品周期虚拟现实的数字化工厂管理系统平台&#xff0c;实现虚拟现实设计制造&#xff0c;防范产品缺陷并预防设备故障&#xff0c;大幅提高生产效率。…

做出选择,直面挑战,揭开数据中心网络的发展真相

为什么&#xff1f;你们发现没有&#xff1f;不知道&#xff0c;从什么时候开始&#xff0c;这个世界&#xff0c;变得越来越快了。快得仿佛昨天刚刚来到这个世界&#xff0c;一眨眼就日暮西山了。是的&#xff0c;时间过得好快&#xff0c;回想起2002年7月电气和电子工程师协会…

炼石:八年饮冰难凉热血,初心如磐百炼成钢

炼石成立八周年 八载笃行&#xff0c;踔厉奋发。创立于2015年的炼石&#xff0c;今天迎来了八岁生日&#xff0c;全体员工共同举行了温暖又充满仪式感的周年庆典。过去的2022&#xff0c;是三年疫情的艰难“收官之年”&#xff0c;新的2023&#xff0c;将是数据安全行业成为独…