1. 程式人生 > >實現簡單的評論區功能

實現簡單的評論區功能

技術分享 view timestamp info \n css代碼 += back 客戶

題述:

使用Node.js實現評論區功能,效果如下圖。每條評論需要動態修改的部分為樓層號(如 #6),時間戳(如 2018-08-13 11:30),評論內容;昵稱和客戶端提示不必修改。要求將評論數據存入文件中。

技術分享圖片

實現所需的文件的目錄

./Comment.js

./index.html

./records.txt

./public/avatar1.jpg

./public/avatar2.jpg

./public/main.css

index.html代碼部分:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5
<meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <link rel="stylesheet" href="main.css"> 9 <title>Question3</title> 10 </head> 11 12
<body> 13 <div class="container"> 14 <div class="comment-send"> 15 <form id="commentForm" method="GET" action="http://127.0.0.1:8888/comment"> 16 <span class="comment-avatar"> 17 <img src="avatar1.jpg" alt="avatar"
> 18 </span> 19 <textarea class="comment-send-input" name="comment" form="commentForm" cols="80" rows="5" placeholder="請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。"></textarea> 20 <input class="comment-send-button" type="submit" value="發表評論"> 21 </form> 22 </div> 23 <div class="comment-list" id="commentList"> 24 <div class="comment"> 25 <span class="comment-avatar"> 26 <img src="avatar1.jpg" alt="avatar"> 27 </span> 28 <div class="comment-content"> 29 <p class="comment-content-name">EdmundDZhang</p> 30 <p class="comment-content-article">驚了</p> 31 <p class="comment-content-footer"> 32 <span class="comment-content-footer-id">#2</span> 33 <span class="comment-content-footer-device">來自安卓客戶端</span> 34 <span class="comment-content-footer-timestamp">2018-01-20 14:05</span> 35 </p> 36 </div> 37 <div class="cls"></div> 38 </div> 39 <div class="comment comment-bottom"> 40 <span class="comment-avatar"> 41 <img src="avatar2.jpg" alt="avatar"> 42 </span> 43 <div class="comment-content"> 44 <p class="comment-content-name">bilibili英雄聯盟賽事</p> 45 <p class="comment-content-article">Hello World!</p> 46 <p class="comment-content-footer"> 47 <span class="comment-content-footer-id">#1</span> 48 <span class="comment-content-footer-device">來自安卓客戶端</span> 49 <span class="comment-content-footer-timestamp">2018-01-20 13:10</span> 50 </p> 51 </div> 52 <div class="cls"></div> 53 </div> 54 </div> 55 </div> 56 </body> 57 58 </html>

main.css代碼部分:

  1 * {
  2   margin: 0;
  3   padding: 0;
  4   font-family: Microsoft YaHei, Arial, Helvetica, sans-serif;
  5 }
  6 
  7 .cls {
  8   clear: both;
  9 }
 10 
 11 .container {
 12   width: 780px;
 13   min-height: 10px;
 14   margin: 50px auto;
 15   /* border: 1px solid #dfdfdf; */
 16 }
 17 
 18 .comment {
 19   min-height: 60px;
 20   /* border: 1px solid red; */
 21 }
 22 
 23 .comment-avatar img {
 24   margin: 20px 0 0 20px;
 25   width: 48px;
 26   height: 48px;
 27   border-radius: 50%;
 28 }
 29 
 30 .comment-content {
 31   float: right;
 32   width: 685px;
 33   padding-top: 15px;
 34   border-top: 1px solid #dfdfdf;
 35 }
 36 
 37 .comment-bottom>.comment-content {
 38   border-bottom: 1px solid #dfdfdf;
 39 }
 40 
 41 .comment-content-name {
 42   color: #6d757a;
 43   font-size: 12px;
 44   margin-bottom: 5px;
 45 }
 46 
 47 .comment-content-article {
 48   font-size: 14px;
 49   margin-bottom: 10px;
 50 }
 51 
 52 .comment-content-footer {
 53   color: #6d757a;
 54   font-size: 12px;
 55   margin-bottom: 15px;
 56 }
 57 
 58 .comment-content-footer span {
 59   margin-right: 10px;
 60 }
 61 
 62 
 63 .comment-send {
 64   position: relative;
 65   margin-bottom: 30px;
 66 }
 67 
 68 .comment-send-input {
 69   outline: none;
 70   box-sizing: border-box;
 71   -moz-box-sizing: border-box;
 72   transition: all 0.3s;
 73   position: absolute;
 74   top: 15px; left: 95px;
 75   resize: none;
 76   width: 605px;
 77   height: 65px;
 78   padding: 10px;
 79   border-radius: 4px;
 80   background: #f4f5f7;
 81   border: 1px solid #e5e9ef;
 82 }
 83 .comment-send-input:hover, .comment-send-input:active {
 84   background: #fff;
 85   color: #555;
 86 }
 87 
 88 .comment-send-button {
 89   border: none;
 90   cursor: pointer;
 91   user-select: none;
 92   -moz-user-select: none;
 93   transition: all 0.3s;
 94   position: absolute;
 95   top: 15px; right: 0px;
 96   width: 65px;
 97   height: 65px;
 98   border-radius: 4px;
 99   background: #1aa2d4;
100   color: #fff;
101   font-size: 14px;
102   text-align: center;
103 }
104 .comment-send-button:hover {
105   background: #1eb6e3;
106 }

Comment.js代碼部分:

 1 const express = require(‘express‘);
 2 const app = express();
 3 const fs = require(‘fs‘);
 4 const sd = require(‘silly-datetime‘);
 5 const readline = require(‘readline‘);
 6 
 7 app.use(express.static(‘./public‘));
 8 
 9 let oldHtmlContent = fs.readFileSync(‘./index.html‘).toString(); //讀取index.html文檔
10 
11 app.get(‘/‘, function(req, res) {
12     res.send(oldHtmlContent);
13     fs.writeFileSync(‘records.txt‘, ‘‘); //初始化txt為空白
14 });
15 
16 app.get(‘/comment‘, function(req, res) {
17 
18     writeRecord(req.query.comment, sd.format(new Date(), ‘YYYY-MM-DD HH:mm‘)); //記錄評論與時間
19 
20     //加載評論
21     let newHtmlContent = ‘‘;
22     let r = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/ //匹配日期
23     let floorNumber = 2;
24     let comment = ‘‘;
25     //使用readline逐行讀取文件
26     const r1 = readline.createInterface({
27         input: fs.createReadStream(‘./records.txt‘)
28     })
29     r1.on(‘line‘, (line) => {
30         if (r.test(line)) {
31             //新評論的HTML代碼
32             newHtmlContent =
33                 `<div class="comment">
34                 <span class="comment-avatar">
35                 <img src="avatar1.jpg" alt="avatar">
36                 </span>
37                 <div class="comment-content">
38                     <p class="comment-content-name">EdmundDZhang</p>
39                     <p class="comment-content-article">${comment}</p>
40                     <p class="comment-content-footer">
41                         <span class="comment-content-footer-id">#${++floorNumber}</span>
42                         <span class="comment-content-footer-device">來自安卓客戶端</span>
43                         <span class="comment-content-footer-timestamp">${line}</span>
44                     </p>
45                 </div>
46                 <div class="cls"></div>
47                 </div>` + newHtmlContent;
48             comment = ‘‘;
49         } else {
50             comment += line;
51         }
52     }).on(‘close‘, () => {
53         res.send(oldHtmlContent.replace(‘<div class="comment-list" id="commentList">‘, ‘<div class="comment-list" id="commentList">\n‘ + newHtmlContent));
54     })
55 })
56 
57 function writeRecord(comment, datetime) {
58     fs.writeFileSync(‘./records.txt‘, `${comment}\n${datetime}\n`, { flag: ‘a‘ });
59 }
60 
61 app.listen(8888, ‘127.0.0.1‘);

2018-11-28 23:53:32

實現簡單的評論區功能