From 745b875b51718824672371c613d2f3e505692cd6 Mon Sep 17 00:00:00 2001 From: many2many <6168830@qq.com> Date: Sun, 13 Oct 2024 11:35:20 +0800 Subject: [PATCH] add task example --- examples/chapter03/tasks/index.html | 5 +- .../chapter03/tasks/参考实现/async-index.js | 129 ++++++++++++++++++ examples/chapter03/tasks/参考实现/index.html | 71 ++++++++++ examples/chapter03/tasks/参考实现/index.js | 125 +++++++++++++++++ 4 files changed, 328 insertions(+), 2 deletions(-) create mode 100644 examples/chapter03/tasks/参考实现/async-index.js create mode 100644 examples/chapter03/tasks/参考实现/index.html create mode 100644 examples/chapter03/tasks/参考实现/index.js diff --git a/examples/chapter03/tasks/index.html b/examples/chapter03/tasks/index.html index 7dd939f..600ac8d 100644 --- a/examples/chapter03/tasks/index.html +++ b/examples/chapter03/tasks/index.html @@ -17,6 +17,7 @@ object-fit: cover; } + @@ -95,8 +96,8 @@
- - + +
diff --git a/examples/chapter03/tasks/参考实现/async-index.js b/examples/chapter03/tasks/参考实现/async-index.js new file mode 100644 index 0000000..5977427 --- /dev/null +++ b/examples/chapter03/tasks/参考实现/async-index.js @@ -0,0 +1,129 @@ +// 定义帖子列表的URL +const postUrl="http://123.249.84.124:8899/posts"; + +// 定义用户列表的URL +const userUrl="http://123.249.84.124:8899/users"; + +/** + * 生成指定帖子的HTML代码(用于展示顶部特色帖子) + * @param {Object} post - 单个帖子对象,包含帖子的详细信息 + * @returns {string} 返回顶部帖子的HTML字符串 + */ +function getTopPostHtml(post){ + // 使用模板字符串拼接HTML结构,并插入帖子数据 + return ` +
+ ... +
+
${post.createDate}
+

${post.title}

+

${post.body}

+
+
+ +
+ +
+
+
+
+ `; +} + +/** + * 生成指定帖子的HTML代码(用于展示普通帖子列表) + * @param {Object} post - 单个帖子对象,包含帖子的详细信息 + * @returns {string} 返回普通帖子的HTML字符串 + */ +function getPostHtml(post){ + // 使用模板字符串拼接HTML结构,并插入帖子数据 + return ` +
+
+
+ ... +
+
+
+
${post.title}
+

${post.body}

+

${post.createDate}

+
+
+
+
+ `; +} + +// 异步函数,用于展示帖子列表 +async function showPosts(){ + // 从服务器获取帖子数据 + let posts = await fetch(postUrl).then(response=>response.json()); + + let postsHtml=""; + // 随机挑选一个帖子作为顶部特色帖子 + const randomId = Math.floor(Math.random() * posts.length); + for(let post of posts){ + if(post.id == randomId){ + // 将随机挑选的帖子以顶部特色帖子的形式展示 + document.getElementById("top-post").innerHTML= getTopPostHtml(post); + continue; + } + if(post.body.length>300){ + // 如果帖子内容过长,只显示前300个字符加省略号 + post.body=post.body.substring(0,300)+"..."; + } + postsHtml+=getPostHtml(post); + } + // 将所有普通帖子添加到页面上 + document.getElementById("posts").innerHTML= postsHtml; + + // 从服务器获取用户数据,并更新帖子的用户信息 + let users = await fetch(userUrl).then(response=>response.json()); + for(let user of users){ + let usernameElements = document.getElementsByClassName("u_"+user.id); + for(let element of usernameElements){ + element.innerText = user.name; + } + } + +} + +// 异步函数,用于创建新帖子 +async function createPost(){ + // 收集表单数据并发送到服务器 + let post = await fetch(postUrl,{ + method:"POST", + headers:{ + "Content-Type":"application/json" + }, + body:JSON.stringify({ + title: document.getElementById("title").value, + body: document.getElementById("body").value, + thumbnail: document.getElementById("thumbnail").value, + coverImage: document.getElementById("cover").value, + userId: document.getElementById("userId").value, + createDate: new Date().toLocaleString() + }) + }).then(response=>response.json()); + + // 在页面上添加新帖子 + let firstPostDiv = document.getElementById("posts").firstChild; + let newPostDiv = document.createElement("div"); + newPostDiv.innerHTML=getPostHtml(post); + document.getElementById("posts").insertBefore(newPostDiv,firstPostDiv); + + // 更新新帖子的用户信息 + let user = await fetch(userUrl+"/"+post.userId).then(response=>response.json()); + document.querySelectorAll(".u_"+post.userId).forEach(e=>e.innerText=user.name); +} + +// 当窗口加载完成时执行以下函数 +window.onload = function(){ + // 展示帖子列表 + showPosts(); + // 监听提交按钮点击事件,以便添加新帖子 + document.getElementById("submit").addEventListener("click",createPost); +}; diff --git a/examples/chapter03/tasks/参考实现/index.html b/examples/chapter03/tasks/参考实现/index.html new file mode 100644 index 0000000..42f1dc0 --- /dev/null +++ b/examples/chapter03/tasks/参考实现/index.html @@ -0,0 +1,71 @@ + + + + + + Chapter03 Example + + + + + + + + + + + + + + +
+
+ +
+
+ +
+ + +
+

发布新帖子

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+
+
+

Copyright © 2024. All rights reserved.

+
+
+
+ + + \ No newline at end of file diff --git a/examples/chapter03/tasks/参考实现/index.js b/examples/chapter03/tasks/参考实现/index.js new file mode 100644 index 0000000..e62b288 --- /dev/null +++ b/examples/chapter03/tasks/参考实现/index.js @@ -0,0 +1,125 @@ +// 定义帖子列表的URL +const postUrl="http://123.249.84.124:8899/posts"; + +// 定义用户列表的URL +const userUrl="http://123.249.84.124:8899/users"; + +/** + * 生成指定帖子的HTML代码(用于展示顶部特色帖子) + * @param {Object} post - 单个帖子对象,包含帖子的详细信息 + * @returns {string} 返回顶部帖子的HTML字符串 + */ +function getTopPostHtml(post){ + // 使用模板字符串拼接HTML结构,并插入帖子数据 + return ` +
+ ... +
+
${post.createDate}
+

${post.title}

+

${post.body}

+
+
+ +
+ +
+
+
+
+ `; +} + +/** + * 生成指定帖子的HTML代码(用于展示普通帖子列表) + * @param {Object} post - 单个帖子对象,包含帖子的详细信息 + * @returns {string} 返回普通帖子的HTML字符串 + */ +function getPostHtml(post){ + // 使用模板字符串拼接HTML结构,并插入帖子数据 + return ` +
+
+
+ ... +
+
+
+
${post.title}
+

${post.body}

+

${post.createDate}

+
+
+
+
+ `; +} + +// 当窗口加载完成时执行以下函数 +window.onload = function(){ + + // 获取帖子数据,并在页面上展示 + fetch(postUrl).then(response=>response.json()).then(posts=>{ + let postsHtml=""; + // 随机挑选一个帖子作为顶部特色帖子 + const randomId = Math.floor(Math.random() * posts.length); + for(let post of posts){ + if(post.id == randomId){ + // 将随机挑选的帖子以顶部特色帖子的形式展示 + document.getElementById("top-post").innerHTML= getTopPostHtml(post); + continue; + } + if(post.body.length>300){ + // 如果帖子内容过长,只显示前300个字符加省略号 + post.body=post.body.substring(0,300)+"..."; + } + postsHtml+=getPostHtml(post); + } + // 将所有普通帖子添加到页面上 + document.getElementById("posts").innerHTML= postsHtml; + }).then((res)=>{ + // 获取用户数据,并在页面上补充用户信息 + fetch(userUrl).then(response=>response.json()).then(users=>{ + for(let user of users){ + let usernameElements = document.getElementsByClassName("u_"+user.id); + for(let element of usernameElements){ + element.innerText = user.name; + } + } + }); + } + ); + + // 监听提交按钮点击事件,以便添加新帖子 + document.getElementById("submit").addEventListener("click",function(){ + // 收集表单数据并发送到服务器 + fetch(postUrl,{ + method:"POST", + headers:{ + "Content-Type":"application/json" + }, + body:JSON.stringify({ + title: document.getElementById("title").value, + body: document.getElementById("body").value, + thumbnail: document.getElementById("thumbnail").value, + coverImage: document.getElementById("cover").value, + userId: document.getElementById("userId").value, + createDate: new Date().toLocaleString() + }) + }).then(response=>response.json()).then(post=>{ + // 将新帖子添加到页面顶部 + let firstPostDiv = document.getElementById("posts").firstChild; + let newPostDiv = document.createElement("div"); + newPostDiv.innerHTML=getPostHtml(post); + document.getElementById("posts").insertBefore(newPostDiv,firstPostDiv); + return post.userId; + }).then((userId)=>{ + // 更新发帖用户的姓名显示 + fetch(userUrl+"/"+userId).then(response=>response.json()).then(user=>{ + document.querySelectorAll(".u_"+userId).forEach(e=>e.innerText=user.name); + }); + }); + }); +}