豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery

@[豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery)

人工Ai 编程

推荐一Kimi https://kimi.moonshot.cn/

推荐二 豆包https://www.doubao.com/

实现效果图

在这里插入图片描述

html 代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale = 1.0">
    <title>Chapter Tree</title>
    <style>
        /* 整体树容器样式 */
        #chapter-tree-container {
            padding-left: 20px;
        }

        /* 章节li样式 */
        li {
            position: relative;
            padding-left: 20px;
            margin: 5px 0;
            line-height: 24px;
        }

        /* 利用伪元素创建线条 */
        li::before {
            content: '';
            position: absolute;
            left: 0;
            top: 12px;
            width: 10px;
            border-top: 1px solid #ccc;
        }

        /* 顶级li去除顶部线条 */
        #chapter-tree-container ul li:first-child::before {
            border-top: none;
        }

        /* 有子章节的li添加垂直线条 */
        li:has(ul)::before {
            height: 100%;
            border-left: 1px solid #ccc;
        }

        /* 子章节ul样式 */
        ul {
            list-style-type: none;
            padding-left: 10px;
        }

        /* 美化 input */
        input.edit-input {
            width: 150px;
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
            font-size: 14px;
            color: #555;
            outline: none;
        }

        input.edit-input::placeholder {
            color: #999;
        }

        /* 美化操作按钮 */
        button {
            padding: 6px 12px;
            background-color: #007BFF;
            color: white;
            border: none;
            border-radius: 4px;
            font-size: 14px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }

        button:hover {
            background-color: #0056b3;
        }

        button.add-button {
            background-color: #28a745;
        }

        button.add-button:hover {
            background-color: #218838;
        }

        button.modify-button {
            background-color: #ffc107;
        }

        button.modify-button:hover {
            background-color: #e0a800;
        }

        button.delete-button {
            background-color: #dc3545;
        }

        button.delete-button:hover {
            background-color: #c82333;
        }

        /* 折叠按钮样式 */
        button[text="+"],
        button[text="-"] {
            width: 24px;
            height: 24px;
            border-radius: 50%;
            padding: 0;
            font-size: 14px;
            line-height: 24px;
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="chapter-tree-container"></div>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        // 初始数据结构,为每个章节添加唯一 id
        var initialData = [
            {
                id: 1,
                name: "第一单元 成长的节拍",
                children: [
                    {
                        id: 2,
                        name: "第一课 中学时代",
                        children: [
                            { id: 3, name: "中学序曲" },
                            { id: 4, name: "珍惜青春" },
                            { id: 5, name: "步入中学生活" }
                        ]
                    },
                    {
                        id: 6,
                        name: "少年有梦",
                        children: [
                            { id: 7, name: "梦想的含义" },
                            { id: 8, name: "努力的意义" },
                            { id: 9, name: "实现理想的途径" },
                            { id: 10, name: "正确对待理想与现实" }
                        ]
                    }
                ]
            }
        ];

        // 渲染树形章节结构
        function renderTree(data) {
            // 清空旧的渲染内容
            $('#chapter-tree-container').empty();
            var ul = $("<ul>");
            function renderChildren(children, parentUl) {
                if (!children) return;
                children.forEach(function (child) {
                    let li;
                    li = $("<li>").data('chapter-id', child.id);
                    var expandButton = $("<button>").text("+");
                    expandButton.click(function () {
                        try {
                            var subUl = li.find("ul");
                            if (subUl.length) {
                                subUl.toggle();
                                expandButton.text(subUl.is(":visible")? "-" : "+");
                            } else {
                                var newSubUl = $("<ul>").hide();
                                renderChildren(child.children, newSubUl);
                                li.append(newSubUl);
                                newSubUl.show();
                                expandButton.text("-");
                            }
                        } catch (error) {
                            console.error('Error in expand button click:', error);
                        }
                    });
                    var chapterNameSpan = $("<span>").text(child.name).addClass('chapter-name-span');
                    // 添加增删改按钮
                    var addButton = $("<button>").text("添加").addClass('add-button');
                    var modifyButton = $("<button>").text("修改").addClass('modify-button');
                    var deleteButton = $("<button>").text("删除").addClass('delete-button');
                    var moveUpButton = $("<button>").text("上移");
                    var moveDownButton = $("<button>").text("下移");
                    var addSubChapterButton = $("<button>").text("添加子章节");

                    addButton.click(function () {
                        try {
                            addChapter(li);
                        } catch (error) {
                            console.error('Error in add button click:', error);
                        }
                    });
                    modifyButton.click(function () {
                        try {
                            var currentLi = $(this).closest('li');
                            var chapterId = currentLi.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (!chapter) {
                                console.error('Chapter not found for modification.');
                                return;
                            }
                            var chapterNameSpan = currentLi.find('.chapter-name-span:eq(0)');
                            var input = $("<input>").val(chapter.name).addClass('edit-input').focus();
                            chapterNameSpan.replaceWith(input);
                            input.on('blur', function () {
                                try {
                                    var newName = $(this).val();
                                    var currentLi = $(this).closest('li');
                                    var chapter = getChapterFromLi(currentLi);
                                    if (chapter) {
                                        chapter.name = newName;
                                        var newChapterNameSpan = $("<span>").text(newName).addClass('chapter-name-span');
                                        $(this).replaceWith(newChapterNameSpan);
                                        if (chapter.children && chapter.children.length > 0) {
                                            var subUl = currentLi.find('ul');
                                            if (!subUl.length) {
                                                subUl = $("<ul>");
                                                renderChildren(chapter.children, subUl);
                                                currentLi.append(subUl);
                                            }
                                        }
                                    }
                                } catch (error) {
                                    console.error('Error in blur event of edit input:', error);
                                }
                            });
                        } catch (error) {
                            console.error('Error in modify button click:', error);
                        }
                    });
                    deleteButton.click(function () {
                        try {
                            var chapterId = li.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (chapter) {
                                deleteChapter(chapter);
                            }
                        } catch (error) {
                            console.error('Error in delete button click:', error);
                        }
                    });
                    moveUpButton.click(function () {
                        try {
                            moveChapterUp(li);
                        } catch (error) {
                            console.error('Error in move up button click:', error);
                        }
                    });
                    moveDownButton.click(function () {
                        try {
                            moveChapterDown(li);
                        } catch (error) {
                            console.error('Error in move down button click:', error);
                        }
                    });
                    addSubChapterButton.click(function () {
                        try {
                            var chapterId = li.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (chapter) {
                                addSubChapter(chapter);
                            }
                        } catch (error) {
                            console.error('Error in add sub-chapter button click:', error);
                        }
                    });

                    li.append(expandButton, chapterNameSpan, addButton, modifyButton, deleteButton, moveUpButton, moveDownButton, addSubChapterButton);
                    if (child.children && child.children.length > 0) {
                        var subUl = $("<ul>");
                        renderChildren(child.children, subUl);
                        li.append(subUl);
                    }
                    parentUl.append(li);
                });
            }
            renderChildren(data, ul);
            $("#chapter-tree-container").append(ul);
        }

        // 添加章节
        function addChapter(clickedLi) {
            try {
                var newChapter = { id: Date.now(), name: "默认章节", children: [] };
                var parentUl = clickedLi.parent('ul');
                var parentChapter;
                if (parentUl.length) {
                    var parentLi = parentUl.parent('li');
                    if (parentLi.length) {
                        parentChapter = getChapterFromLi(parentLi);
                    } else {
                        // 顶级 ul 的情况
                        parentChapter = { children: initialData };
                    }
                } else {
                    // 顶级 li 的情况
                    parentChapter = { children: initialData };
                }
                if (!parentChapter.children) {
                    parentChapter.children = [];
                }
                parentChapter.children.push(newChapter);
                renderTree(initialData);
            } catch (error) {
                console.error('Error in addChapter function:', error);
            }
        }

        // 添加子章节
        function addSubChapter(parentNode) {
            try {
                var newChapter = { id: Date.now(), name: "默认子章节", children: [] };
                if (!parentNode.children) {
                    parentNode.children = [];
                }
                parentNode.children.push(newChapter);
                renderTree(initialData);
            } catch (error) {
                console.error('Error in addSubChapter function:', error);
            }
        }

        // 删除章节
        function deleteChapter(node) {
            try {
                if (node.parent) {
                    var index = node.parent.children.indexOf(node);
                    if (index >-1) {
                        node.parent.children.splice(index, 1);
                    }
                } else {
                    var index = initialData.indexOf(node);
                    if (index >-1) {
                        initialData.splice(index, 1);
                    }
                }
                renderTree(initialData);
            } catch (error) {
                console.error('Error in deleteChapter function:', error);
            }
        }

        // 章节上移
        function moveChapterUp(li) {
            try {
                var prevLi = li.prev("li");
                if (prevLi.length) {
                    var prevIndex = li.parent().children().index(prevLi);
                    var currentIndex = li.parent().children().index(li);
                    var parent = getParentOfLi(li);
                    if (parent && Array.isArray(parent.children)) {
                        var chapter = getChapterFromLi(li);
                        if (chapter) {
                            parent.children.splice(currentIndex, 1);
                            parent.children.splice(prevIndex, 0, chapter);
                        }
                    } else if (!parent && Array.isArray(initialData)) {
                        var chapter = getChapterFromLi(li);
                        if (chapter) {
                            initialData.splice(currentIndex, 1);
                            initialData.splice(prevIndex, 0, chapter);
                        }
                    }
                    li.insertBefore(prevLi);
                }
            } catch (error) {
                console.error('Error in moveChapterUp function:', error);
            }
        }

        // 章节下移
        function moveChapterDown(li) {
            try {
                var nextLi = li.next("li");
                if (nextLi.length) {
                    var nextIndex = li.parent().children().index(nextLi);
                    var currentIndex = li.parent().children().index(li);
                    var parent = getParentOfLi(li);
                    if (parent && Array.isArray(parent.children)) {
                        var chapter = getChapterFromLi(li);
                        if (chapter) {
                            parent.children.splice(currentIndex, 1);
                            parent.children.splice(nextIndex + 1, 0, chapter);
                        }
                    } else if (!parent && Array.isArray(initialData)) {
                        var chapter = getChapterFromLi(li);
                        if (chapter) {
                            initialData.splice(currentIndex, 1);
                            initialData.splice(nextIndex + 1, 0, chapter);
                        }
                    }
                    li.insertAfter(nextLi);
                }
            } catch (error) {
                console.error('Error in moveChapterDown function:', error);
            }
        }

        function getParentOfLi(li) {
            try {
                var parentLi = li.parent('li');
                if (parentLi.length) {
                    var parentChapterId = parentLi.data('chapter-id');
                    return findChapterById(parentChapterId, initialData);
                }
                return null;
            } catch (error) {
                console.error('Error in getParentOfLi function:', error);
            }
        }

        function getChapterFromLi(li) {
            try {
                var chapterId = li.data('chapter-id');
                return findChapterById(chapterId, initialData);
            } catch (error) {
                console.error('Error in getChapterFromLi function:', error);
            }
        }

        function findChapterById(id, data) {
            try {
                for (var i = 0; i < data.length; i++) {
                    if (data[i].id === id) {
                        return data[i];
                    }
                    if (data[i].children && data[i].children.length > 0) {
                        var found = findChapterById(id, data[i].children);
                        if (found) {
                            return found;
                        }
                    }
                }
                return null;
            } catch (error) {
                console.error('Error in findChapterById function:', error);
            }
        }

        // 初始化渲染
        $(document).ready(function () {
            renderTree(initialData);
        });
    </script>
</body>

</html>

上一版本有问题,下面是最新版本的。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale = 1.0">
    <title>Chapter Tree</title>
    <style>
        /* 整体树容器样式 */
        #chapter-tree-container {
            padding-left: 20px;
        }

        /* 章节li样式 */
        li {
            position: relative;
            padding-left: 20px;
            margin: 5px 0;
            line-height: 24px;
        }

        /* 利用伪元素创建线条 */
        li::before {
            content: '';
            position: absolute;
            left: 0;
            top: 12px;
            width: 10px;
            border-top: 1px solid #ccc;
        }

        /* 顶级li去除顶部线条 */
        #chapter-tree-container ul li:first-child::before {
            border-top: none;
        }

        /* 有子章节的li添加垂直线条 */
        li:has(ul)::before {
            height: 100%;
            border-left: 1px solid #ccc;
        }

        /* 子章节ul样式 */
        ul {
            list-style-type: none;
            padding-left: 10px;
        }

        /* 美化 input */
        input.edit-input {
            width: 150px;
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
            font-size: 14px;
            color: #555;
            outline: none;
        }

        input.edit-input::placeholder {
            color: #999;
        }

        /* 美化操作按钮 */
        button {
            padding: 6px 12px;
            background-color: #007BFF;
            color: white;
            border: none;
            border-radius: 4px;
            font-size: 14px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }

        button:hover {
            background-color: #0056b3;
        }

        button.add-button {
            background-color: #28a745;
        }

        button.add-button:hover {
            background-color: #218838;
        }

        button.modify-button {
            background-color: #ffc107;
        }

        button.modify-button:hover {
            background-color: #e0a800;
        }

        button.delete-button {
            background-color: #dc3545;
        }

        button.delete-button:hover {
            background-color: #c82333;
        }

        /* 折叠按钮样式 */
        button[text="+"],
        button[text="-"] {
            width: 24px;
            height: 24px;
            border-radius: 50%;
            padding: 0;
            font-size: 14px;
            line-height: 24px;
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="chapter-tree-container"></div>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        // 初始数据结构,为每个章节添加唯一 id
        var initialData = [
            {
                id: 1,
                name: "第一单元 成长的节拍",
                children: [
                    {
                        id: 2,
                        name: "第一课 中学时代",
                        children: [
                            { id: 3, name: "中学序曲" },
                            { id: 4, name: "珍惜青春" },
                            { id: 5, name: "步入中学生活" }
                        ]
                    },
                    {
                        id: 6,
                        name: "少年有梦",
                        children: [
                            { id: 7, name: "梦想的含义" },
                            { id: 8, name: "努力的意义" },
                            { id: 9, name: "实现理想的途径" },
                            { id: 10, name: "正确对待理想与现实" }
                        ]
                    }
                ]
            }
        ];

        // 记录展开状态的对象
        var expandedStates = {};

        // 渲染树形章节结构
        function renderTree(data) {
            // 清空旧的渲染内容
            $('#chapter-tree-container').empty();
            var ul = $("<ul>");
            function renderChildren(children, parentUl) {
                if (!children) return;
                children.forEach(function (child) {
                    let li;
                    li = $("<li>").data('chapter-id', child.id);
                    var expandButton = $("<button>").text(expandedStates[child.id]? "-" : "+");
                    expandButton.click(function () {
                        try {
                            var subUl = li.find("ul");
                            if (subUl.length) {
                                subUl.toggle();
                                expandButton.text(subUl.is(":visible")? "-" : "+");
                                expandedStates[child.id] = subUl.is(":visible");
                            } else {
                                var newSubUl = $("<ul>").hide();
                                renderChildren(child.children, newSubUl);
                                li.append(newSubUl);
                                newSubUl.show();
                                expandButton.text("-");
                                expandedStates[child.id] = true;
                            }
                        } catch (error) {
                            console.error('Error in expand button click:', error);
                        }
                    });
                    var chapterNameSpan = $("<span>").text(child.name).addClass('chapter-name-span');
                    // 添加增删改按钮
                    var addButton = $("<button>").text("添加").addClass('add-button');
                    var modifyButton = $("<button>").text("修改").addClass('modify-button');
                    var deleteButton = $("<button>").text("删除").addClass('delete-button');
                    var moveUpButton = $("<button>").text("上移");
                    var moveDownButton = $("<button>").text("下移");
                    var addSubChapterButton = $("<button>").text("添加子章节");

                    addButton.click(function () {
                        try {
                            addChapter(li);
                        } catch (error) {
                            console.error('Error in add button click:', error);
                        }
                    });
                    modifyButton.click(function () {
                        try {
                            var currentLi = $(this).closest('li');
                            var chapterId = currentLi.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (!chapter) {
                                console.error('Chapter not found for modification.');
                                return;
                            }
                            var chapterNameSpan = currentLi.find('.chapter-name-span:eq(0)');
                            var input = $("<input>").val(chapter.name).addClass('edit-input').focus();
                            chapterNameSpan.replaceWith(input);
                            input.on('blur', function () {
                                try {
                                    var newName = $(this).val();
                                    var currentLi = $(this).closest('li');
                                    var chapter = getChapterFromLi(currentLi);
                                    if (chapter) {
                                        chapter.name = newName;
                                        var newChapterNameSpan = $("<span>").text(newName).addClass('chapter-name-span');
                                        $(this).replaceWith(newChapterNameSpan);
                                        if (chapter.children && chapter.children.length > 0) {
                                            var subUl = currentLi.find('ul');
                                            if (!subUl.length) {
                                                subUl = $("<ul>");
                                                renderChildren(chapter.children, subUl);
                                                currentLi.append(subUl);
                                            }
                                        }
                                    }
                                } catch (error) {
                                    console.error('Error in blur event of edit input:', error);
                                }
                            });
                        } catch (error) {
                            console.error('Error in modify button click:', error);
                        }
                    });
                    deleteButton.click(function () {
                        try {
                            var chapterId = li.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (chapter && (!chapter.children || (chapter.children && chapter.children.length === 0))) {
                                deleteChapter(chapter);
                            }
                        } catch (error) {
                            console.error('Error in delete button click:', error);
                        }
                    });
                    moveUpButton.click(function () {
                        try {
                            moveChapterUp(li);
                        } catch (error) {
                            console.error('Error in move up button click:', error);
                        }
                    });
                    moveDownButton.click(function () {
                        try {
                            moveChapterDown(li);
                        } catch (error) {
                            console.error('Error in move down button click:', error);
                        }
                    });
                    addSubChapterButton.click(function () {
                        try {
                            var chapterId = li.data('chapter-id');
                            var chapter = findChapterById(chapterId, initialData);
                            if (chapter) {
                                addSubChapter(chapter);
                            }
                        } catch (error) {
                            console.error('Error in add sub - chapter button click:', error);
                        }
                    });

                    li.append(expandButton, chapterNameSpan, addButton, modifyButton, deleteButton, moveUpButton, moveDownButton, addSubChapterButton);
                    if (child.children && child.children.length > 0) {
                        var subUl = $("<ul>");
                        renderChildren(child.children, subUl);
                        li.append(subUl);
                        if (expandedStates[child.id]) {
                            subUl.show();
                            expandButton.text("-");
                        } else {
                            subUl.hide();
                            expandButton.text("+");
                        }
                    }
                    parentUl.append(li);
                });
            }
            renderChildren(data, ul);
            $("#chapter-tree-container").append(ul);
        }

        // 添加章节
        function addChapter(clickedLi) {
            try {
                var newChapter = { id: Date.now(), name: "默认章节", children: [] };
                var parentUl = clickedLi.parent('ul');
                var parentChapter;
                if (parentUl.length) {
                    var parentLi = parentUl.parent('li');
                    if (parentLi.length) {
                        parentChapter = getChapterFromLi(parentLi);
                    } else {
                        // 顶级 ul 的情况
                        parentChapter = { children: initialData };
                    }
                } else {
                    // 顶级 li 的情况
                    parentChapter = { children: initialData };
                }
                if (!parentChapter.children) {
                    parentChapter.children = [];
                }
                parentChapter.children.push(newChapter);
                renderTree(initialData);
            } catch (error) {
                console.error('Error in addChapter function:', error);
            }
        }

        // 添加子章节
        function addSubChapter(parentNode) {
            try {
                var newChapter = { id: Date.now(), name: "默认子章节", children: [] };
                if (!parentNode.children) {
                    parentNode.children = [];
                }
                parentNode.children.push(newChapter);
                renderTree(initialData);
            } catch (error) {
                console.error('Error in addSubChapter function:', error);
            }
        }

        // 删除章节
        function deleteChapter(node) {
            try {
                let parent;
                let parentArray;
                if (node.id === initialData[0].id) {
                    initialData = [];
                } else {
                    const findParent = (data) => {
                        for (let i = 0; i < data.length; i++) {
                            if (data[i].children) {
                                for (let j = 0; j < data[i].children.length; j++) {
                                    if (data[i].children[j].id === node.id) {
                                        return { parent: data[i], index: j };
                                    }
                                }
                                const result = findParent(data[i].children);
                                if (result) {
                                    return result;
                                }
                            }
                        }
                        return null;
                    };
                    const parentInfo = findParent(initialData);
                    if (parentInfo) {
                        parent = parentInfo.parent;
                        parentArray = parent.children;
                        parentArray.splice(parentInfo.index, 1);
                    }
                }
                renderTree(initialData);
            } catch (error) {
                console.error('Error in deleteChapter function:', error);
            }
        }

        // 章节上移
        function moveChapterUp(li) {
            try {
                var chapter = getChapterFromLi(li);
                if (!chapter) {
                    return;
                }
                var parentArray = findContainingArray(chapter, initialData);
                if (!parentArray) {
                    return;
                }
                var currentIndex = parentArray.indexOf(chapter);
                if (currentIndex > 0) {
                    var temp = parentArray[currentIndex - 1];
                    parentArray[currentIndex - 1] = chapter;
                    parentArray[currentIndex] = temp;
                    renderTree(initialData);
                }
            } catch (error) {
                console.error('Error in moveChapterUp function:', error);
            }
        }

        // 章节下移
        function moveChapterDown(li) {
            try {
                var chapter = getChapterFromLi(li);
                if (!chapter) {
                    return;
                }
                var parentArray = findContainingArray(chapter, initialData);
                if (!parentArray) {
                    return;
                }
                var currentIndex = parentArray.indexOf(chapter);
                if (currentIndex < parentArray.length - 1) {
                    var temp = parentArray[currentIndex + 1];
                    parentArray[currentIndex + 1] = chapter;
                    parentArray[currentIndex] = temp;
                    renderTree(initialData);
                }
            } catch (error) {
                console.error('Error in moveChapterDown function:', error);
            }
        }

        function findContainingArray(target, data) {
            for (let i = 0; i < data.length; i++) {
                if (data[i].id === target.id) {
                    return data;
                }
                if (data[i].children) {
                    const subArray = findContainingArray(target, data[i].children);
                    if (subArray) {
                        return subArray;
                    }
                }
            }
            return null;
        }

        function getChapterFromLi(li) {
            const chapterId = li.data('chapter-id');
            return findChapterById(chapterId, initialData);
        }

        function findChapterById(id, data) {
            for (let i = 0; i < data.length; i++) {
                if (data[i].id === id) {
                    return data[i];
                }
                if (data[i].children) {
                    const found = findChapterById(id, data[i].children);
                    if (found) {
                        return found;
                    }
                }
            }
            return null;
        }

        // 初始化渲染
        $(document).ready(function () {
            renderTree(initialData);
        });
    </script>
</body>

</html>

学习Ai 大模型 第一步学会使用这些工具助手

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SMT32U575RIT单片机-中断练习

任务 查看手册对所有的拓展板上和相对应的底板的引脚对应的端口找到以下结论 通过STM32MX软件对各个引脚进行相应的配置 1.第一种切换模式电脑发送 #include "main.h" #include "icache.h" #include "usart.h" #include "gpio.h"/*…

HNU人工智能期末复习知识点整理

考纲 选择题 ( 30 分 ) (30分) (30分)&#xff1a; 15 15 15个单选 选择题范围为 PPT 内容&#xff0b;课本内容 计算、简答、推理题 ( 70 分 ) (70分) (70分)&#xff1a; 4 4 4个大题&#xff0c;每个大题 2 ∼ 3 2 \sim 3 2∼3小问 4 4 4个大题分别为&#xff1a;机器学习、…

设计DCDC的 Layout的秘诀

很多DCDC芯片的手册都有对应的PCB Layout设计要求&#xff0c;有些还会提供一些Layout示意图&#xff0c;都是大同小异的。 比如我随便列几点buck的设计要点&#xff1a; 1、输入电容器和二极管在与IC相同的面&#xff0c;尽可能在IC最近处。 2、电感靠近芯片的SW&#xff0c;输…

自动驾驶控制与规划——Project 6: A* Route Planning

目录 零、任务介绍一、算法原理1.1 A* Algorithm1.2 启发函数 二、代码实现三、结果分析四、效果展示4.1 Dijkstra距离4.2 Manhatten距离4.3 欧几里德距离4.4 对角距离 五、后记 零、任务介绍 carla-ros-bridge/src/ros-bridge/carla_shenlan_projects/carla_shenlan_a_star_p…

单纯形法的学习笔记

文章目录 A. 单纯形法概述1. 优化模型示例 B. 理论基础C. 算法思想D. 实现算法1. 线性规划的标准型2. 顶点解的理解及表示2.1 在标准型中变量取值为零的意义2.2 顶点解的表示 3. 最优性判断4. 解的更新5. 完成迭代过程 E. 单纯形法的基本概念与本文对照F. 文档源码 前言&#x…

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块&#xff0c;PCIE转以太网模块、 USB转以太网模块等&#xff0c;这样我们的网络需求就不止是上网这么简单了&#xff0c;可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…

[Linux]线程概念与控制

目录 一、线程概念 1.什么是线程 2.线程的轻量化 3.LWP字段 4.局部性原理 5.线程的优缺点 6.进程VS线程 二、线程的控制 1.线程创建 2.获取线程id 3.线程退出与等待 4.创建轻量级进程 三、线程的管理 1.pthread库管理线程 2.线程局部存储 四、C线程库 1.构造函…

cmake--库链接--RPATH--RUNPATH

RPATH--RUNPATH RPATH 是一种嵌入到二进制文件(可执行文件/库文件)中的路径信息&#xff0c;也就是存在于可执行文件或者库文件中的&#xff0c; 用RPATH(旧)或者RUNPATH(新)参数记录的路径信息&#xff0c; 指示动态链接器在运行时查找共享库的位置。 查看二进制文件的RPATH或…

Chapter 4.4:Adding shortcut connections

4 Implementing a GPT model from Scratch To Generate Text 4.4 Adding shortcut connections 接下来&#xff0c;让我们讨论 shortcut connections&#xff08;快捷连接&#xff09;背后的概念&#xff0c;也称为 skip connections&#xff08;跳跃连接&#xff09;或 resid…

Web渗透测试之XSS跨站脚本 原理 出现的原因 出现的位置 测试的方法 危害 防御手段 面试题 一篇文章给你说的明明白白

目录 XSS介绍的原理和说明 Cross Site Scripting 钓鱼 XSS攻击原理 XSS漏洞出现的原因&#xff1a; XSS产生的原因分析 XSS出现位置&#xff1a; XSS测试方法 XSS的危害 防御手段&#xff1a; 其它防御 面试题: 备注&#xff1a; XSS介绍的原理和说明 嵌入在客户…

热门数据手套对比,应用方向有何不同?

AI与人形机器人是目前市场中大热的两个新行业。在人形机器人或拟人仿真机器人制造与开发中动作捕捉技术的融入是必不可少的&#xff0c;通过将动捕数据与先进的AI大数据训练技术相结合&#xff0c;不仅能够省去枯燥乏味的动作编程过程大幅减少训练时间&#xff0c;还可以使训练…

dbt Semantic Layer 详细教程-1 :总体概述

dbt 语义模型提供语言描述方式快速定义业务指标。本文介绍语义模型作用和意义&#xff0c;以及语义模型的组成部分&#xff0c;后面会继续介绍如何定义语义模型&#xff0c;基于语义模型定义指标&#xff0c;如何通过MetricFlow&#xff08;语义层框架&#xff09;能够构建用于…

JAVA:探讨 CopyOnWriteArrayList 的详细指南

1、简述 在 Java 的并发编程中&#xff0c;CopyOnWriteArrayList 是一种特殊的线程安全的集合类。它位于 java.util.concurrent 包中&#xff0c;主要用于在并发读写场景下提供稳定的性能。与传统的 ArrayList 不同&#xff0c;CopyOnWriteArrayList 通过在每次修改时创建一个…

简单编程实现QT程序黑色主题显示

代码如下 int main(int argc, char *argv[]) {QApplication a(argc, argv);//QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());QPalette darkpalette;a.setStyle(QStyleFactory::create("Fusion"));darkpalette.setColor(QPalette::Wind…

沁恒CH32V208GBU6外设PWM:注意分辨时钟使能函数RCC_APB2PeriphClockCmd;PWM模式1和模式2的区别;PWM动态开启和关闭

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

飞书企业消息实践

一、飞书自带的消息机器人限制 频控策略 - 服务端 API - 飞书开放平台 自定义机器人的频率控制和普通应用不同&#xff0c;为单租户单机器人 100 次/分钟&#xff0c;5 次/秒。建议发送消息尽量避开诸如 10:00、17:30 等整点及半点时间&#xff0c;否则可能出现因系统压力导致…

0107作业

思维导图 练习: 要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序 排序、 成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和delete完成 #include <iostream>using namespace std…

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号&#xff08;;&#xff09;结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

面试题:并发与并行的区别?

并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是计算机科学中两个相关但不同的概念&#xff0c;它们都涉及到同时处理多个任务&#xff0c;但在实现方式和效果上有显著的区别。理解这两者的区别对于编写高效的多任务程序非常重要。 并发&…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…