基于华为云主机 CodeArts IDE 与 JavaScript 的网页留言板设计

本案例由开发者:华为2024年第三批次协同育人项目-山东科技大学-崔宾阁老师提供

1 概述

1.1 案例介绍

随着社交互动需求的日益增长,留言板作为一种典型的用户交流功能,已被广泛应用于博客、论坛及各类社交平台中。华为云主机为前端开发提供了稳定高效的运行环境,使开发者能够在云端快速搭建应用。

本案例依托华为开发者空间提供的云主机与CodeArts IDE,结合JavaScript技术,开发了一个完整的网页留言板功能。项目实现了一个在线留言板,首先设计了留言板的基础框架,包括留言输入区域、留言板选择下拉框、留言展示区域等。通过监听表单提交与按钮点击事件,动态地将留言添加到对应的留言板,并支持在页面上实时显示与删除留言。留言数据统一存储在浏览器的 LocalStorage 中,即使刷新页面也能保留。开发者可在云端环境中进行代码编写与运行,利用弹性高效的计算资源,无需关注底层基础设施,即可专注于前端功能的实现。

通过本案例,开发者将掌握 JavaScript 在网页互动功能中的应用,重点学习 HTML5 DOM 操作、事件监听、LocalStorage 本地存储及 CSS 样式控制等技术。同时,开发者将熟悉云主机及 CodeArts IDE for Java 开发环境,提升项目实战能力,为后续更复杂的 Web 应用开发打下坚实基础。

1.2 案例时间

本案例总时长预计30分钟。

1.3 案例流程

58e1ae8d1322452a88cbf37af12f4fd3

说明:

① 申请并登录华为开发者空间—云主机,打开 CodeArts IDE 创建工程;

② 在云主机 CodeArts IDE for Java 中编写案例项目代码;

③ 通过 Firefox 启动案例项目的入口文件。

1.4 资源总览

本案例预计花费总计0元。

资源名称规格单价(元)时长(分钟)
开发者空间—云主机鲲鹏|4 vCPUs|8GB|Ubuntu030
CodeArts IDECodeArts IDE for java030


2 操作步骤

2.1 配置开发者空间—云主机

本案例中,使用华为开发者空间所提供的云主机平台以及CodeArts+JavaScript开发工具,完成网页留言板案例的开发工作。点击链接( https://support.developer.huaweicloud.com/doc/development/resource-tools/zh-cn_topic_0000002367559525-0000002367559525 )可跳转至免费领取云主机指南。

1. 在浏览器中输入华为云开发者空间网址:https://developer.huaweicloud.com/developerspace,进入到华为云开发者空间页面。

在华为开发者空间页面点击“免费领取”,跳转到开发者空间页面,如未领取根据页面提示进行云主机领取。

c47e63f091c04448ab3b44b743e7c776

2. 在开发者空间页面,点击左侧“工作台”按钮进入工作台页面,再点击“配置云主机”进行云主机的配置。

514243f70b2441ac9b6caaa50b01ca88

3. 在配置云主机窗口中自定义云主机名称,配置完毕后点击“安装”。

701ed0294224460687306136e189188e

4. 安装完毕后点击“打开云主机”>“进入桌面”即可进入云主机。

b04edd1c32c44ef08a8c3ce483136d2d

5. 等待环境云主机下载镜像、安装系统、安装工具集,首次进入云主机大约需要3至5分钟。

3bb48a58f8d549a0b9c40b240a85be6a

6. 环境准备完毕后,即可进入云主机,云主机桌面如下图所示。

744af0b4304741b5a659e881150d372c

2.2 创建项目

1. 双击打开云主机桌面上的CodeArts IDE for java(虽然IDE名称带有“Java”,但本案例用于编写JavaScript前端代码)。

2b96730ac2924fa59db36e56a36ede11

2. 首次使用CodeArts IDE创建工程,可直接点击左侧栏目中的“新建工程”,创建网页留言板工程项目。

b73540b329d34ae99f08d9106031e24e

3. 新建工程后,在工程名称栏输入:MessageBoard,工程存放位置、构建系统及JDK直接使用默认配置,接着点击右下角蓝色“创建”按钮。

dd11b6b15afc429e9cef83fdc789bcbe

4. 在“MessageBoard” 工程项目中,点击左上角新建HTML文件,输入:messageboard.html,输入完毕后按下回车键,该文件用于存放实现网页留言板的代码,代码内容在后续文中进行介绍。

87b8a1d89830418aa9d0bc8898beb224

2.3 编写代码

以下是网页留言板的实现代码(存放在messageboard.html文件),可供参考学习。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>多留言板</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }
        .container {
            display: flex;
            flex-direction: column;
            align-items: center;
            width: 100%;
            max-width: 1200px;
            padding: 20px;
            background: #fff;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
            overflow: hidden;
        }
        .input-section {
            width: 100%;
            max-width: 800px;
            margin-bottom: 20px;
            background: #f9f9f9;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            transition: box-shadow 0.3s ease;
        }
        .input-section:hover {
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
        }
        .board-selector {
            display: flex;
            justify-content: space-between;
            margin-bottom: 10px;
        }
        .board-selector select {
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f9f9f9;
            color: #333;
            font-size: 16px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }
        .board-selector select:hover {
            background-color: #e1f5fe;
        }
        .input-section textarea {
            width: 100%;
            max-width: 100%;
            margin-bottom: 10px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            font-size: 16px;
            color: #333;
            resize: none;
            transition: border-color 0.3s ease;
        }
        .input-section textarea:focus {
            border-color: #007bff;
        }
        .input-section button {
            padding: 10px 20px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s ease;
        }
        .input-section button:hover {
            background-color: #0056b3;
        }
        .boards {
            display: flex;
            justify-content: space-around;
            width: 100%;
            max-width: 1200px;
        }
        .board {
            flex: 1;
            margin: 0 10px;
            background: #f9f9f9;
            border: 1px solid #ccc;
            border-radius: 10px;
            padding: 20px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            transition: box-shadow 0.3s ease;
        }
        .board:hover {
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
        }
        .board h2 {
            text-align: center;
            color: #333;
            margin-bottom: 20px;
        }
        .board .messages {
            max-height: 300px;
            overflow-y: auto;
            padding: 10px;
            background-color: #e1f5fe;
            border: 1px solid #b3e5fc;
            border-radius: 10px;
        }
        .board .message {
            padding: 10px;
            margin-bottom: 10px;
            background-color: #e1f5fe;
            border: 1px solid #b3e5fc;
            border-radius: 5px;
            font-size: 14px;
            color: #333;
            transition: background-color 0.3s ease;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .board .message:hover {
            background-color: #d0e8f9;
        }
        .board .message button {
            padding: 5px 10px;
            background-color: #ff4d4d;
            color: #fff;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 12px;
            transition: background-color 0.3s ease;
        }
        .board .message button:hover {
            background-color: #ff1a1a;
        }
        .board .messages::-webkit-scrollbar {
            width: 8px;
        }
        .board .messages::-webkit-scrollbar-thumb {
            background-color: #ccc;
            border-radius: 4px;
        }
        .board .messages::-webkit-scrollbar-track {
            background-color: #f1f1f1;
            border-radius: 4px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="input-section">
        <div class="board-selector">
            <label for="boardSelect">选择留言板:</label>
            <select id="boardSelect">
                <option value="board1">留言板1</option>
                <option value="board2">留言板2</option>
                <option value="board3">留言板3</option>
            </select>
        </div>
        <form id="messageForm">
            <textarea id="messageInput" placeholder="请输入留言..." rows="4"></textarea>
            <button type="submit">提交留言</button>
        </form>
    </div>
    <div class="boards">
        <div class="board" id="board1">
            <h2>留言板1</h2>
            <div class="messages" id="messages1"></div>
        </div>
        <div class="board" id="board2">
            <h2>留言板2</h2>
            <div class="messages" id="messages2"></div>
        </div>
        <div class="board" id="board3">
            <h2>留言板3</h2>
            <div class="messages" id="messages3"></div>
        </div>
    </div>
</div>
<script>
    document.addEventListener('DOMContentLoaded', () => {
        const messageForm = document.getElementById('messageForm');
        const messageInput = document.getElementById('messageInput');
        const boardSelect = document.getElementById('boardSelect');
        const boards = ['board1', 'board2', 'board3'];
        const allBoards = JSON.parse(localStorage.getItem('allBoards')) || {
            board1: [],
            board2: [],
            board3: []
        };
        // 显示所有留言板的留言
        function displayMessages() {
            boards.forEach(board => {
                const messagesDiv = document.getElementById(`messages${board.slice(-1)}`);
                const messages = allBoards[board];
                messagesDiv.innerHTML = '';
                messages.forEach((message, index) => {
                    const messageElement = document.createElement('div');
                    messageElement.classList.add('message');
                    messageElement.innerHTML = `
                        ${message}
                        <button class="delete-button" data-board="${board}" data-index="${index}">删除</button>
                    `;
                    messagesDiv.appendChild(messageElement);
                });
            });
        }
        // 初始化时显示所有留言板的留言
        displayMessages();

        messageForm.addEventListener('submit', (e) => {
            e.preventDefault();
            const message = messageInput.value.trim();
            if (message) {
                const currentBoard = boardSelect.value;
                allBoards[currentBoard].push(message);
                localStorage.setItem('allBoards', JSON.stringify(allBoards));
                // 更新显示
                displayMessages();
                messageInput.value = '';
            }
        });
        // 监听删除按钮的点击事件
        document.addEventListener('click', (e) => {
            if (e.target.classList.contains('delete-button')) {
                const board = e.target.getAttribute('data-board');
                const index = e.target.getAttribute('data-index');
                allBoards[board].splice(index, 1);
                localStorage.setItem('allBoards', JSON.stringify(allBoards));
                displayMessages();
            }
        });
    });
</script>
</body>
</html>

本案例通过综合运用 HTML 结构划分CSS 布局与样式美化JavaScript 事件监听与本地存储,实现了一个多留言板网页,主要技术实现如下:

HTML结构:页面分为输入区与展示区。输入区包括留言文本框、留言板选择下拉框和提交按钮;展示区包含三个独立的留言板,每个留言板内有留言展示容器 <div class="messages">,用于动态渲染留言内容。

CSS布局与样式:整体采用flex布局,将输入区与留言板区域分列排布;通过阴影、圆角、悬停效果增强交互体验;为留言板设置独立滚动条(overflow-y: auto),保证多条留言展示时界面整洁。

数据存储:利用浏览器的localStorage保存留言数据,数据结构为对象{ board1:[], board2:[], board3:[] }。这样即使刷新页面,留言内容也能持久化保存。

事件监听与动态渲染:通过监听表单submit事件获取留言内容,写入对应的留言板数组,并调用渲染函数displayMessages(),将所有留言以<div class="message">的形式展示到对应留言板中。

删除功能与事件委托:每条留言右侧附带一个“删除”按钮。通过事件委托监听click事件,捕捉按钮点击后根据data-boarddata-index精确定位留言,从数组中删除并更新localStorage,再重新渲染页面。

2.4 留言板网页展示

1. 在 CodeArts IDE for Java 中,右击“messageboard.html”文件,然后点击“打开所在的文件夹”。

d91cd4acf34b41e48f0d8863a7b09b1a

2. 在弹出来的文件夹中,右击“messageboard.html”文件,然后选择用“Firefox”打开。

f0402aafbc074570993b773a305287a5

3. 留言板网页展示:本案例的留言板网页实现了留言提交、展示和删除等功能。

①  留言提交:首先选择想要留言的留言板,在下方输入留言,例如:“华为云主机安全可靠,为团队协作和高效开发提供了有力支持!”,点击“提交留言”。

16cd7b0896934c19b87a379365472267

②  留言展示:“提交留言”后,可以在下方对应的留言板上看到留言。

8754178f8c4d4fcba5c40e722305d4e2

③  留言删除:若不想留言,可以点击红色“删除”按钮,删除留言。

0cc57d9958bf4e86bda752db0c1c6876

④  多留言板展示:留言板可以展示多条留言,增加页面的互动性和实用性。

d2265288a48d4ce4b71b56f5ba651d00

至此本次实验全部内容完成。

2.5 拓展实验

1. 增强交互性:比如在留言提交时,系统自动为每条留言添加提交时间戳,方便用户查看留言顺序;同时为每条留言提供点赞按钮,点击后点赞数即时更新并保存到本地存储,使留言板更具互动性。

2. 功能扩展:比如在留言板上方增加搜索框,用户输入关键字后,系统能够实时筛选并仅显示包含该关键字的留言。

3. 欢迎自由发挥。


3 释放资源

3.1 关闭云主机

1. 使用完毕后,点击云主机桌面顶端菜单中的“关机”按钮,在弹出的对话框中点击“确定”即可退出云主机。

0f49efa282d8483db8f927df30568ae0

2. 点击“确定”按钮后页面自动跳转到开发者空间页面,可以看到我的云主机显示“关机中”,说明云主机正在关机。

6e74b6f90cba4ccfbb948ea948fb666a

3.2 检查资源

云主机关机后,等待3至5分钟,当我的云主机显示“已就绪”时,说明云主机成功关机,下次使用云主机只需点击“打开云主机”>“进入桌面”即可,可参考2.1小节。

5dd5d8203452471a90525a105ff83bdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值