完成一个有趣的Web期末大作业(html、css、javascript、MySQL、Node.js) ...

打印 上一主题 下一主题

主题 523|帖子 523|积分 1569

标题:学校老师的要求很开放,要本身做一个感兴趣的网页,要求使用基础的html、css和javascript,后端要使用数据库。 网上都是各种管理系统,看多了觉得没啥意思,要做一个本身感兴趣的网站。近几年着迷犬夜叉这部动漫,就花了两天的时间创建了一个犬夜叉的网站,对于期末大作业来说充足了。
    必要源码可以接洽我的邮箱 1329690093@qq.com
  一、实行工具

   运行系统:Windows11
编程语言:html+css+javascript+node.js
IDE:VsCode
安装:Node.js v18.18.0 (网上有安装教程)
数据库:mysql 18.0.3.0
vscode插件:
- MySQL v6.8.9

- Live Server v5.7.9

- open in browser

- HTML CSS Support v1.13.1

  二、设计过程

前端要求

在举行设计的时候,采用html和css相联合,对网页举行布局规划,形成得当动漫网站风格的页面,具体要求如下:


  • 色彩:登录界面用清新的绿色按钮,首页则用深绿色导航栏搭配浅绿色按钮,配合动漫风格。
  • 布局:两个界面均采用简便的卡片布局,信息分区清楚。
  • 字体:简单易读的字体,如微软雅黑,确保文字在各种装备上都清晰。
  • 元素:圆角的输入框和按钮,简便的图标和图片。
  • 交互:明确的交互反馈,如点击按钮后的视觉效果。
  • 顺应性:界面要顺应不同装备和屏幕。
  • 兼容性:在多种浏览器和操作系统上都能保持一致表现。
页面布局


具体布局模块

首页模块



  • 用户接待信息 :表现 “ 接待 ‘用户名’ + 登录 ”。
  • 导航栏:包罗首页、先容、图片、视频&音频、论坛等链接。
  • 页脚:展示作者信息及邮箱接洽方式。
内容展示模块



  • 先容页面:展示犬夜叉动漫先容。
  • 图片页面:展示四张犬夜叉相干图片。
  • 视频&音频页面:展示一个视频和五首音乐。
  • 论坛页面:提供批评区,用户可以发表并存储批评。
Node.js



  • 服务器搭建:使用Node.js搭建网站服务器,处理请求。
  • 提供静态文件服务,如HTML页面、CSS样式表、客户端JavaScript文件等。
script.js



  • 前端逻辑处理:控制注册和登录表单的提交,与服务器端举行异步交互;
    实现客户端表单验证,确保数据的准确性在发送到服务器之前举行校验;
    负责处理用户在导航栏的页面跳转逻辑。
comment.js



  • 批评地区功能:管理批评的提交,通过AJAX与服务器举行数据交换。
  • 在页面上动态表现用户批评。
  • 确保用户提交的批评及时更新并正确存储到数据库。
以上模块协同工作,共同提供一个交互式的用户体验,答应用户在一个安全和友好的环境中举行注册、登录、内容查察、以及社区交流。
项目工程:

三、界面&代码

登岸界面

设计的很草率,能实现注册和登录的功能

登岸界面代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Login and Registration</title>
  7.     <style>
  8.         body {
  9.             font-family: Arial, sans-serif;
  10.             background-color: #f7f7f7;
  11.             display: flex;
  12.             justify-content: center;
  13.             align-items: center;
  14.             height: 100vh;
  15.             margin: 0;
  16.         }
  17.         form {
  18.             background-color: #fff;
  19.             padding: 20px;
  20.             margin: 10px;
  21.             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  22.             border-radius: 8px;
  23.         }
  24.         input {
  25.             display: block;
  26.             width: 100%;
  27.             padding: 10px;
  28.             margin: 10px 0;
  29.             border: 1px solid #ddd;
  30.             border-radius: 4px;
  31.             box-sizing: border-box;
  32.         }
  33.         button {
  34.             width: 100%;
  35.             padding: 10px;
  36.             background-color: #5cb85c;
  37.             color: white;
  38.             border: none;
  39.             border-radius: 4px;
  40.             cursor: pointer;
  41.             font-size: 16px;
  42.             margin: 10px 0;
  43.         }
  44.         button:hover {
  45.             background-color: #4cae4c;
  46.         }
  47.         .container {
  48.             width: 300px;
  49.         }
  50.     </style>
  51. </head>
  52. <body>
  53.     <div class="container">
  54.         <!-- 登录表单 -->
  55.         <form id="login-form">
  56.             <input type="text" id="login-username" placeholder="用户名" required>
  57.             <input type="password" id="login-password" placeholder="密码" required>
  58.             <button type="submit">登录</button>
  59.         </form>
  60.       
  61.         <!-- 注册表单 -->
  62.         <form id="register-form">
  63.             <input type="text" id="register-username" placeholder="用户名" required>
  64.             <input type="password" id="register-password" placeholder="密码" required>
  65.             <button type="submit">注册</button>
  66.         </form>
  67.     </div>
  68.     <script src="script.js"></script>
  69. </body>
  70. </html>
复制代码
主界面:

主界面代码:
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>犬夜叉爱好者网</title>
  6.     <link rel="stylesheet" href="style.css">
  7.   </head>
  8.     <header>
  9.     <div id="user-greeting" class="user-greeting">
  10.         欢迎, <span id="username">访客</span>!
  11.     </div>
  12.     <h1>犬夜叉世界</h1>
  13.    
  14.     <img src="picture/Inuyasha.png" alt="犬夜叉图片">
  15.     <nav>
  16.     <ul>
  17.       <li><span>主页</span></li>
  18.       <li><a href="介绍.html">介绍</a></li>
  19.       <li><a href="图片.html">图片</a></li>
  20.       <li><a href="视频&音频.html">视频</a></li>
  21.       <li><a href="论坛.html">论坛</a></li>
  22.     </ul>
  23.   </nav>
  24.   </header>
  25.   <script>
  26.     // 页面加载时检查用户名
  27.     document.addEventListener('DOMContentLoaded', function () {
  28.         const storedUsername = localStorage.getItem('username');
  29.         if (storedUsername) {
  30.             document.getElementById('username').textContent = storedUsername;
  31.         } else {
  32.             document.getElementById('username').textContent = '访客';
  33.         }
  34.     });
  35.   </script>
  36.   <main>
  37.     <article>
  38.       <h2>欢迎</h2>
  39.       <p>欢迎来到"犬夜叉世界"——一个专注于日本动漫《犬夜叉》的综合性网站。在这里,您可以找到关于《犬夜叉》的各种信息,包括动漫介绍、收藏图片、收藏视频,以及我们自建的犬夜叉论坛。</p>
  40.       <hr />
  41.       <p>在"犬夜叉世界",我们致力于为动漫爱好者提供一个全面、多元化的交流平台。我们的网站内容包括动漫介绍,详细介绍了《犬夜叉》的主要角色、故事情节和特色亮点。此外,我们还提供了一个丰富的图片库,收录了大量精美的《犬夜叉》角色图片和场景截图。</p>
  42.       <hr />
  43.       <p>在视频和音频收藏部分,我们收集了《犬夜叉》的精彩片段和音乐、剧场版动画和特别版动画,供您随时观看和回味。这些视频不仅可以让您重温动漫中的经典场景,还能让您感受到《犬夜叉》世界中的奇幻与浪漫。</p>
  44.       <hr />
  45.       <p>除了以上内容,我们还为您打造了一个专属的犬夜叉论坛。在这里,您可以与其他动漫爱好者分享心得、讨论剧情、交流感想。我们鼓励大家积极发表自己的看法,分享对《犬夜叉》的热爱与感悟。</p>
  46.       <hr />
  47.       <p>"犬夜叉世界"致力于为广大动漫爱好者提供一个优质、便捷的在线交流平台。我们诚挚邀请您加入我们的大家庭,与我们一起分享对《犬夜叉》的热爱,共同度过美好的时光。</p>
  48.       <hr />
  49.       <p>请随时关注我们的网站更新,以便获取更多精彩内容和活动信息。谢谢您的光临,"犬夜叉世界"期待您的加入!</p>
  50. </article>
  51. <aside>
  52.       <a href="picture/侧边栏.png"><img src="picture/侧边栏.png" alt="点击缩略图查看完整照片"></a>
  53.       <a href="picture/侧边栏2.png"><img src="picture/侧边栏2.png" alt="点击缩略图查看完整照片"></a>
  54. </aside>
  55. </main>
  56. <footer>
  57.       <p>网站作者:王子一</p>
  58.       <p><a href="mailto:1329690093@qq.com">这是我的邮箱</a> 有需要可以随时联系我。</p>
  59. </footer>
  60. </body>
  61. </html>
复制代码
先容界面:

先容界面代码:
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>犬夜叉爱好者网</title>
  6.     <link rel="stylesheet" href="style.css">
  7.   </head>
  8.     <header>
  9.     <h1>犬夜叉世界</h1>
  10.     <img src="picture/Inuyasha.png" alt="犬夜叉图片">
  11.     <nav>
  12.     <ul>
  13.       <li><a href="index.html">主页</a></li>
  14.       <li><span>介绍</span></li>
  15.       <li><a href="图片.html">图片</a></li>
  16.       <li><a href="视频&音频.html">视频</a></li>
  17.       <li><a href="论坛.html">论坛</a></li>
  18.     </ul>
  19.   </nav>
  20.   </header>
  21.   
  22.   <main>
  23.     <article>
  24.       <h2>剧情介绍</h2>
  25.       <p>《犬夜叉》的剧情主要围绕着半妖犬夜叉和人类少女日暮戈薇展开。故事发生在日本战国时代,当时妖怪和人类之间存在激烈的冲突。犬夜叉是一个半妖,因为他的父亲是大妖怪斗牙王,母亲是人类公主十六夜。由于自己的半妖身份,犬夜叉在人类和妖怪之间都受到排斥。</p>
  26.       <hr />
  27.       <p>  日暮戈薇是一个勇敢、善良的初三女生,她通过自家神社的食骨之井穿越时空来到500年前的日本战国时代,遇到了犬夜叉。为了寻找散落于各处的四魂之玉碎片并保护它,犬夜叉和日暮戈薇以及他们的伙伴们开始了冒险之旅。</p>
  28.       <hr />
  29.       <p>  在这个过程中,犬夜叉和日暮戈薇不断成长并建立深厚的感情。同样是在寻找四魂之玉的过程中,他们遇到了巫女桔梗,一个拥有强大灵力的女子。桔梗为了保护和净化四魂之玉,不断与前来抢夺四魂之玉的妖怪战斗。在这个过程中,犬夜叉和桔梗之间也产生了深深的感情。</p>
  30.       <hr />
  31.       <p>在不断的相互了解中,犬夜叉和日暮戈薇、桔梗之间都建立了深厚的感情。最终他们约定利用四魂之玉的力量,把犬夜叉变成人类,守护使命结束的桔梗也可以回归到平凡生活。然而在这个过程中,奈落出现了,他是一个邪恶的妖怪,企图利用四魂之玉的力量实现自己的目的。为了阻止奈落的阴谋,犬夜叉和日暮戈薇、桔梗以及他们的伙伴们展开了一场激烈的战斗。</p>
  32.       <hr />
  33.       <p>在战斗中,犬夜叉通过与日暮戈薇和桔梗的紧密合作以及自身的勇气和智慧,最终成功地打败了奈落,守护了四魂之玉。在这个过程中,他也逐渐成长为一个有担当、有责任、有勇气、有智慧的男子汉。</p>
  34.       <hr />
  35.       <p>总的来说,《犬夜叉》是一部充满冒险、成长、爱情和友情的故事。通过这个故事,观众可以看到主人公们在面对困难和挑战时如何勇敢地奋斗,以及他们之间的深厚感情。同时,故事也探讨了人类和妖怪之间的关系和共存问题,以及爱情、友情等主题。</p>
  36. </article>
  37. <aside>
  38.       <a href="picture/侧边栏.png"><img src="picture/侧边栏.png" alt="点击缩略图查看完整照片"></a>
  39.       <a href="picture/侧边栏2.png"><img src="picture/侧边栏2.png" alt="点击缩略图查看完整照片"></a>
  40. </aside>
  41. </main>
  42. <footer>
  43.       <p>网站作者:王子一</p>
  44.       <p><a href="mailto:1329690093@qq.com">这是我的邮箱</a> 有需要可以随时联系我。</p>
  45. </footer>
  46. </body>
  47. </html>
复制代码
图片界面:

图片界面代码:
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>犬夜叉爱好者网</title>
  6.     <link rel="stylesheet" href="style.css">
  7.   </head>
  8.     <header>
  9.     <h1>犬夜叉世界</h1>
  10.     <img src="picture/Inuyasha.png" alt="犬夜叉图片">
  11.     <nav>
  12.     <ul>
  13.       <li><a href="index.html">主页</a></li>
  14.       <li><a href="介绍.html">介绍</a></li>
  15.       <li><span>图片</span></li>
  16.       <li><a href="视频&音频.html">视频</a></li>
  17.       <li><a href="论坛.html">论坛</a></li>
  18.     </ul>
  19.   </nav>
  20.   </header>
  21.   <main>
  22.     <article>  
  23.         <h2>图片</h2>  
  24.         <div class="row">  
  25.           <figure>  
  26.             <img src="picture/Inuyasha.jpg"  
  27.             alt="图片1"  
  28.             width="350"  
  29.             height="250">
  30.             <figcaption>图片1</figcaption>  
  31.           </figure>  
  32.           <figure>  
  33.             <img src="picture/犬夜叉3.jpg"  
  34.             alt="图片2"  
  35.             width="350"  
  36.             height="250">
  37.             <figcaption>图片2</figcaption>   
  38.           </figure>  
  39.         </div>  
  40.         <div class="row">  
  41.           <figure>  
  42.             <img src="picture/犬夜叉6.jpg"  
  43.             alt="图片3"  
  44.             width="350"  
  45.             height="250">  
  46.             <figcaption>图片3</figcaption>  
  47.           </figure>  
  48.           <figure>  
  49.             <img src="picture/犬夜叉7.jpg"  
  50.             alt="图片4"  
  51.             width="350"  
  52.             height="250">  
  53.             <figcaption>图片4</figcaption>  
  54.           </figure>  
  55.         </div>  
  56.     </article>
  57.    
  58. <aside>
  59.       <a href="picture/侧边栏.png"><img src="picture/侧边栏.png" alt="点击缩略图查看完整照片"></a>
  60.       <a href="picture/侧边栏2.png"><img src="picture/侧边栏2.png" alt="点击缩略图查看完整照片"></a>
  61. </aside>
  62. </main>
  63. <footer>
  64.       <p>网站作者:王子一</p>
  65.       <p><a href="mailto:1329690093@qq.com">这是我的邮箱</a> 有需要可以随时联系我。</p>
  66. </footer>
  67. </body>
  68. </html>
复制代码
视频&音乐界面:

  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>犬夜叉爱好者网</title>
  6.     <link rel="stylesheet" href="style.css">
  7.   </head>
  8.     <header>
  9.     <h1>犬夜叉世界</h1>
  10.     <img src="picture/Inuyasha.png" alt="犬夜叉图片">
  11.     <nav>
  12.     <ul>
  13.       <li><a href="index.html">主页</a></li>
  14.       <li><a href="介绍.html">介绍</a></li>
  15.       <li><a href="图片.html">图片</a></li>
  16.       <li><span>视频&音频</span></li>
  17.       <li><a href="论坛.html">论坛</a></li>
  18.     </ul>
  19.   </nav>
  20.   </header>
  21.   
  22.   <main>
  23.       <article>
  24.         <h2>视频&音频</h2>
  25.         <div class="media-container">
  26.           <div class="video-container">
  27.             <video
  28.               controls
  29.               width="500"
  30.               height="500"
  31.               autoplay
  32.               loop
  33.               muted
  34.               poster="picture/2.jpg">
  35.               <source src="picture/视频.mp4" type="video/mp4" />
  36.               <p>
  37.                 你的浏览器不支持 HTML5 视频观看。
  38.               </p>
  39.             </video>
  40.           </div>
  41.           <div class="audio-container">
  42.             <div class="audio-item">
  43.               <h3>Every Heart</h3>
  44.               <audio controls>
  45.                 <source src="music/BoA - Every Heart-ミンナノキモチ- (全心全意).mp3" type="audio/mp3" />
  46.                 <p>你的浏览器不支持 HTML5 音频收听。</p>
  47.               </audio>
  48.             </div>
  49.             <div class="audio-item">
  50.               <h3>Dearest</h3>
  51.               <audio controls>
  52.                 <source src="music/Gfanfan - Dearest.mp3" type="audio/mp3" />
  53.                 <p>你的浏览器不支持 HTML5 音频收听。</p>
  54.               </audio>
  55.             </div>
  56.             <div class="audio-item">
  57.               <h3>哀歌</h3>
  58.               <audio controls>
  59.                 <source src="music/和田薫 - 哀歌.mp3" type="audio/mp3" />
  60.                 <p>你的浏览器不支持 HTML5 音频收听。</p>
  61.               </audio>
  62.             </div>
  63.             <div class="audio-item">
  64.               <h3>ふたりの気持ち</h3>
  65.               <audio controls>
  66.                 <source src="music/和田薫 - ふたりの気持ち.mp3" type="audio/mp3" />
  67.                 <p>你的浏览器不支持 HTML5 音频收听。</p>
  68.               </audio>
  69.             </div>
  70.             <div class="audio-item">
  71.               <h3>时代を越える想い</h3>
  72.               <audio controls>
  73.                 <source src="music/和田薫 - 時代を越える想い (穿越时空的思念)(Moscow Recording Ver.).mp3" type="audio/mp3" />
  74.                 <p>你的浏览器不支持 HTML5 音频收听。</p>
  75.               </audio>
  76.             </div>
  77.           </div>
  78.         </div>
  79.       </article>
  80. <aside>
  81.       <a href="picture/侧边栏.png"><img src="picture/侧边栏.png" alt="点击缩略图查看完整照片"></a>
  82.       <a href="picture/侧边栏2.png"><img src="picture/侧边栏2.png" alt="点击缩略图查看完整照片"></a>
  83. </aside>
  84. </main>
  85. <footer>
  86.       <p>网站作者:王子一</p>
  87.       <p><a href="mailto:1329690093@qq.com">这是我的邮箱</a> 有需要可以随时联系我。</p>
  88. </footer>
  89. </body>
  90. </html>
复制代码
论坛界面:

  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>犬夜叉爱好者网</title>
  6.     <link rel="stylesheet" href="style.css">
  7.   </head>
  8. <body>
  9.     <header>
  10.       <div id="user-greeting" class="user-greeting">
  11.         欢迎, <span id="username">访客</span>!
  12.     </div>
  13.     <h1>犬夜叉世界</h1>
  14.     <img src="picture/Inuyasha.png" alt="犬夜叉图片">
  15.     <nav>
  16.     <ul>
  17.       <li><a href="index.html">主页</a></li>
  18.       <li><a href="介绍.html">介绍</a></li>
  19.       <li><a href="图片.html">图片</a></li>
  20.       <li><a href="视频&音频.html">视频</a></li>
  21.       <li><span>论坛</span></li>
  22.     </ul>
  23.   </nav>
  24.   </header>
  25.   </script>
  26.   <main>
  27.     <article>
  28.       <section id="comments-section">
  29.         <!-- 评论展示区域 -->
  30.       </section>
  31.       
  32.       <!-- 评论提交表单 -->
  33.       <form id="comment-form">
  34.         <textarea id="comment-content" placeholder="写下你的评论..."></textarea>
  35.         <button type="submit">发送</button>
  36.       </form>
  37. </article>
  38. <aside>
  39.       <a href="picture/侧边栏.png"><img src="picture/侧边栏.png" alt="点击缩略图查看完整照片"></a>
  40.       <a href="picture/侧边栏2.png"><img src="picture/侧边栏2.png" alt="点击缩略图查看完整照片"></a>
  41. </aside>
  42. </main>
  43. <footer>
  44.       <p>网站作者:王子一</p>
  45.       <p><a href="mailto:1329690093@qq.com">这是我的邮箱</a> 有需要可以随时联系我。</p>
  46. </footer>
  47. <script src="common.js"></script>
  48. </body>
  49. </html>
复制代码
服务器搭建(Node.js):
  1. const express = require('express');
  2. const mysql = require('mysql');
  3. const bodyParser = require('body-parser');
  4. const cors = require('cors');
  5. const bcrypt = require('bcrypt');
  6. const saltRounds = 10;
  7. const app = express();
  8. app.use(cors());
  9. app.use(bodyParser.json());
  10. app.use(express.json());
  11. app.use(express.urlencoded({ extended: true }));
  12. // 连接数据库配置
  13. const connection = mysql.createConnection({
  14.     host: 'localhost',
  15.     user: 'root',
  16.     password: 'nan198614',
  17.     database: 'Inuyasha'
  18. });
  19. connection.connect();
  20. // 注册端点
  21. app.post('/register', async (req, res) => {
  22.     try {
  23.         const { username, password } = req.body;
  24.         const hashedPassword = await bcrypt.hash(password, saltRounds);
  25.         const query = `INSERT INTO users (username, password) VALUES (?, ?)`;
  26.         connection.query(query, [username, hashedPassword], (err, results) => {
  27.             if (err) {
  28.                 // 处理错误,例如用户名已存在
  29.                 return res.status(500).json({ message: 'User registration failed' });
  30.             }
  31.             return res.status(200).json({ message: 'User registered successfully' });
  32.         });
  33.     } catch (err) {
  34.         res.status(500).json({ message: 'Server error' });
  35.     }
  36. });
  37. // 登录端点
  38. app.post('/login', async (req, res) => {
  39.     try {
  40.         const { username, password } = req.body;
  41.         const query = `SELECT * FROM users WHERE username = ?`;
  42.         connection.query(query, [username], async (err, results) => {
  43.             if (err || results.length === 0) {
  44.                 return res.status(401).json({ message: 'Authentication failed' });
  45.             }
  46.             const user = results[0];
  47.             const isValid = await bcrypt.compare(password, user.password);
  48.             if (isValid) {
  49.                 return res.status(200).json({ message: 'Authentication successful' });
  50.             } else {
  51.                 return res.status(401).json({ message: 'Authentication failed' });
  52.             }
  53.         });
  54.     } catch (err) {
  55.         res.status(500).json({ message: 'Server error' });
  56.     }
  57. });
  58. app.get('/get-comments', (req, res) => {
  59.     console.log('get-comments route was called');
  60.     const query = 'SELECT * FROM comments ORDER BY create_time DESC';
  61.     connection.query(query, (err, results) => {
  62.         if (err) {
  63.             // 处理可能发生的错误
  64.             return res.status(500).json({ message: 'Error retrieving comments' });
  65.         }
  66.         res.status(200).json(results);
  67.     });
  68. });
  69. // 发布评论端点
  70. app.post('/post-comment', (req, res) => {
  71.     const { username, content } = req.body;
  72.     const query = 'INSERT INTO comments (user, content, create_time) VALUES (?, ?, NOW())';
  73.     connection.query(query, [username, content], (err, results) => {
  74.         if (err) {
  75.             console.error(err); // 打印错误
  76.             return res.status(500).json({ message: 'Error posting comment', error: err.message });
  77.         }
  78.         res.status(200).json({ message: 'Comment posted successfully' });
  79.     });
  80. });
  81. const PORT = process.env.PORT || 5500;
  82. app.listen(PORT, () => {
  83.     console.log(`Server is running on port ${PORT}`);
  84. });
复制代码
批评处理脚本(common.js)
  1. // 页面加载时检查用户名并设置评论表单的事件监听器
  2. document.addEventListener('DOMContentLoaded', function () {
  3.     const storedUsername = localStorage.getItem('username');
  4.     if (storedUsername) {
  5.         document.getElementById('username').textContent = storedUsername;
  6.     } else {
  7.         document.getElementById('username').textContent = '访客';
  8.     }
  9.     // 当页面加载时,获取并显示评论
  10.     fetchComments();
  11.     // 处理评论提交
  12.     var commentForm = document.getElementById('comment-form');
  13.     if (commentForm) {
  14.       commentForm.onsubmit = function (event) {
  15.         event.preventDefault(); // 阻止默认提交行为
  16.         const username = storedUsername; // 从本地存储或其他地方获取用户名
  17.         const content = document.getElementById('comment-content').value;
  18.         postComment(username, content); // 异步发送评论到服务器
  19.     };
  20.     } else {
  21.         console.error('The comment form was not found.');
  22.     }
  23. });
  24.   
  25. function fetchComments() {
  26.   fetch('http://localhost:5500/get-comments')
  27.     .then(response => response.json())
  28.     .then(comments => {
  29.       const commentsSection = document.getElementById('comments-section');
  30.       commentsSection.innerHTML = ''; // 清空现有评论
  31.       comments.forEach(comment => {
  32.         console.log(comment.username);
  33.         const commentDiv = document.createElement('div');
  34.         commentDiv.className = 'comment';
  35.         // 创建显示用户名的元素
  36.         const usernameSpan = document.createElement('span');
  37.         usernameSpan.className = 'comment-username';
  38.         usernameSpan.textContent = comment.user; // 假设返回的对象有一个username属性
  39.         // 创建显示评论内容的元素
  40.         const contentDiv = document.createElement('div');
  41.         contentDiv.className = 'comment-content';
  42.         contentDiv.textContent = comment.content; // 假设返回的对象有一个content属性
  43.         // 创建显示评论时间的元素
  44.         const timeSpan = document.createElement('span');
  45.         timeSpan.className = 'comment-time';
  46.         timeSpan.textContent = new Date(comment.create_time).toLocaleString(); // 格式化时间,假设返回的对象有一个create_time属性
  47.         // 将用户名、评论内容和时间添加到评论的div中
  48.         commentDiv.appendChild(usernameSpan);
  49.         commentDiv.appendChild(contentDiv);
  50.         commentDiv.appendChild(timeSpan);
  51.         // 将完整的评论元素添加到评论区域
  52.         commentsSection.appendChild(commentDiv);
  53.       });
  54.     })
  55.     .catch(error => {
  56.       console.error('Error:', error);
  57.     });
  58. }
  59.   
  60.   // 发布评论的函数
  61.   function postComment(username, content) {
  62.     fetch('http://localhost:5500/post-comment', {
  63.       method: 'POST',
  64.       headers: {
  65.         'Content-Type': 'application/json',
  66.       },
  67.       body: JSON.stringify({ username: username, content: content }),
  68.     })
  69.     .then(response => {
  70.       if (response.ok) {
  71.         return response.json();
  72.       }
  73.       throw new Error('Network response was not ok.');
  74.     })
  75.     .then(data => {
  76.       console.log('Success:', data);
  77.       fetchComments(); // 重新加载评论
  78.     })
  79.     .catch(error => {
  80.       console.error('Error:', error);
  81.     });
  82.   }
复制代码
注册脚本(script.js):
  1. document.addEventListener('DOMContentLoaded', function () {
  2.     // 注册表单
  3.     const registerForm = document.getElementById('register-form');
  4.     registerForm.onsubmit = function (event) {
  5.         event.preventDefault();
  6.         const username = document.getElementById('register-username').value;
  7.         const password = document.getElementById('register-password').value;
  8.         fetch('http://localhost:5500/register', {
  9.         method: 'POST',
  10.         headers: {
  11.             'Content-Type': 'application/json',
  12.         },
  13.         body: JSON.stringify({ username, password }),
  14.         })
  15.         .then(response => response.json())
  16.         .then(data => {
  17.         alert(data.message);
  18.         })
  19.         .catch((error) => {
  20.         console.error('Error:', error);
  21.         });
  22.     };
  23.     // 登录表单
  24.     const loginForm = document.getElementById('login-form');
  25.     loginForm.onsubmit = function (event) {
  26.         event.preventDefault();
  27.         const username = document.getElementById('login-username').value;
  28.         const password = document.getElementById('login-password').value;
  29.    
  30.         fetch('http://localhost:5500/login', {
  31.             method: 'POST',
  32.             headers: {
  33.                 'Content-Type': 'application/json',
  34.             },
  35.             body: JSON.stringify({ username, password }),
  36.         })
  37.         .then(response => response.json())
  38.         .then(data => {
  39.             if (data.message === 'Authentication successful') {
  40.                 // 存储用户名到LocalStorage
  41.                 localStorage.setItem('username', username);
  42.    
  43.                 // 跳转到主页
  44.                 window.location.href = 'index.html';
  45.             } else {
  46.                 alert(data.message);
  47.             }
  48.         })
  49.         .catch((error) => {
  50.             console.error('Error:', error);
  51.         });
  52.     };
  53. });
复制代码
css文件(style.css):
  1. /* || 一般设置 */
  2. html, body {
  3.   margin: 0;
  4.   padding: 0;
  5. }
  6. html {
  7.   font-size: 10px;
  8.   background-color: #a9a9a9;
  9. }
  10. body {
  11.   width: 70%;
  12.   min-width: 800px;
  13.   margin: 0 auto;
  14. }
  15. /* || 排版 */
  16. h1, h2, h3 {
  17.   font-family: 'Long Cang', cursive;
  18.   color: #2a2a2a;
  19. }
  20. p, input, li {
  21.   font-family: 'Noto Sans SC', sans-serif;
  22.   color: #2a2a2a;
  23. }
  24. h1 {
  25.   font-size: 4rem;
  26.   text-align: center;
  27.   text-shadow: 2px 2px 10px black;
  28. }
  29. h2 {
  30.   font-size: 3rem;
  31.   text-align: center;
  32. }
  33. h3 {
  34.   font-size: 2.2rem;
  35. }
  36. p, li {
  37.   font-size: 1.6rem;
  38.   line-height: 1.5;
  39. }
  40. /* || 标题布局 */
  41. header {
  42.   margin-bottom: 10px;
  43.   display: flex;
  44.   flex-flow: row wrap;
  45. }
  46. main, header, nav, article, aside, footer, section {
  47.   background-color: rgba(29, 149, 125, 0.5);
  48.   padding: 1%;
  49. }
  50. h1 {
  51.   flex: 5;
  52.   text-transform: uppercase;
  53. }
  54. header img {
  55.   display: block;
  56.   height: 60px;
  57.   padding-top: 20.15px;
  58. }
  59. nav {
  60.   height: 50px;
  61.   flex: 100%;
  62.   display: flex;
  63. }
  64. nav ul {
  65.   padding: 0;
  66.   list-style-type: none;
  67.   flex: 2;
  68.   display: flex;
  69. }
  70. nav li {
  71.   display: inline;
  72.   text-align: center;
  73.   flex: 1;
  74. }
  75. nav a, nav span {
  76.   display: inline-block;
  77.   font-size: 2rem;
  78.   height: 3rem;
  79.   line-height: 1.7;
  80.   text-transform: uppercase;
  81.   text-decoration: none;
  82.   color: black;
  83. }
  84. .row {
  85.   display: flex;
  86.   justify-content: space-around;
  87. }
  88. figure {
  89.   margin: 10px;
  90. }
  91. .media-container {
  92.   display: flex;
  93.   align-items: flex-start;
  94. }
  95. .video-container {
  96.   margin-right: 20px;
  97. }
  98. .audio-container {
  99.   display: flex;
  100.   flex-direction: column;
  101.   justify-content: space-around;
  102. }
  103. .audio-item h3 {
  104.   margin: 0;
  105.   padding: 5px 0; /* 为标题添加一些垂直空间 */
  106. }
  107. .audio-item {
  108.   margin-bottom: 10px; /* 为每个音频项添加一些垂直空间 */
  109. }
  110. /* || 主体布局 */
  111. .user-greeting {
  112.   position: absolute; /* 使元素相对于最近的定位祖先元素定位 */
  113.   top: 0;
  114.   left: 0;
  115.   margin: 30px; /* 或根据需要调整 */
  116.   z-index: 10; /* 确保它不会被其他元素遮挡 */
  117. }
  118. header {
  119.   position: relative; /* 这将允许 .user-greeting 相对于 header 定位 */
  120.   /* 其他样式 */
  121. }
  122. main {
  123.   display: flex;
  124. }
  125. article, section {
  126.   flex: 4;
  127. }
  128. aside {
  129.   flex: 1;
  130.   margin-left: 10px;
  131.   padding: 0; /* 设置padding为0,防止内边距影响图片大小 */
  132. }
  133. aside a {
  134.   display: block;
  135.   width: 100%; /* 设置宽度为100%,允许<a>标签占满整个容器 */
  136.   float: none; /* 如果不需要浮动,可以去掉float属性 */
  137. }
  138. aside img {
  139.   display: block; /* 使图片块级显示,去掉图片下方的默认间隙 */
  140.   width: 100%; /* 图片宽度为100%,使其占满<a>标签 */
  141.   height: auto; /* 设置高度为auto,保持图片比例不变 */
  142.   max-width: 100%; /* 最大宽度为100%,确保图片不会超出其容器 */
  143. }
  144. footer {
  145.   margin-top: 10px;
  146. }
  147. #comments-section {
  148.   margin-bottom: 20px;
  149. }
  150. #comment-content {
  151.   width: 100%;
  152.   height: 100px;
  153. }
  154. /* 评论列表样式 */
  155. .comment {
  156.   margin-bottom: 10px;
  157.   padding: 5px;
  158.   border: 1px solid #ccc;
  159. }
复制代码
四、毗连数据库

首先在浏览器下载mysql并创建用户,推荐这个教程,我跟着几分钟就弄好了
https://blog.csdn.net/weixin_39289696/article/details/128850498
注意,账号暗码要记得,后面还要用
然后,在vscode下载的mysql插件中创建数据库并毗连

点击NoSQL,create connection,然后创建毗连,输入你在当地电脑mysql的用户名(一样平常为root),暗码,点击链接即可

毗连成功后:

之后在里面创建数据库,我定名为 Inuyasha,然后创建两个表,创建表的sql和表的布局如下,大家可以本身去创建一下:
1、users表
  1. CREATE TABLE
  2.     `users` (
  3.         `user_id` int NOT NULL AUTO_INCREMENT,
  4.         `username` varchar(50) NOT NULL,
  5.         `password` varchar(255) NOT NULL,
  6.         `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  7.         PRIMARY KEY (`user_id`),
  8.         UNIQUE KEY `username` (`username`)
  9.     ) ENGINE = InnoDB AUTO_INCREMENT = 11 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
复制代码

2、comments表
  1. CREATE TABLE
  2.     `comments` (
  3.         `id` int NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
  4.         `user` char(50) NOT NULL COMMENT 'User Name',
  5.         `content` char(200) NOT NULL COMMENT 'Comment Content',
  6.         `create_time` datetime DEFAULT NULL COMMENT 'Create Time',
  7.         PRIMARY KEY (`id`)
  8.     ) ENGINE = InnoDB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'Table for storing user comments'
复制代码

五、使用方法



  • 安装node.js依赖的package
    工程里有一个package.json,里面有我们要安装的东西

  • 终端输入: npm install --dependencies 举行安装

  • 打开Node.js终端,输入 node Node.js

  • 在login.html文件下 点击右下角下载好的live server,进入登录界面

  • 注册并登录

可以在数据库中看到注册前和注册后users表的对比查察数据库是否毗连成功:
注册前:

注册:

注册后:

成功插入到数据库users表中就阐明数据库毗连成功了
发表批评,点击发送后批评就会表现在网页上面:

查察数据库,成功插入表中:

有问题随时来讨论!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表