文章导读::{},"data":{"gid":"6881813937621303822","group_source":2,"publish_time":"1602297168","title":"构建一个即时消息应用(七):Access 页面","content":" 现在我们已经完成了后端,让我们转到前端。 我将采用……各位看官请向下阅读:
:{},"data":{"gid":"6881813937621303822","group_source":2,"publish_time":"1602297168","title":"构建一个即时消息应用(七):Access 页面","content":"
现在我们已经完成了后端,让我们转到前端。 我将采用单页应用程序方案。
• 来源:linux.cn • 作者:Nicolás Parada • 译者:XianLei Gao •
(本文字数:11404,阅读时长大约:12 分钟)
本文是该系列的第七篇。
第一篇: 模式第二篇: OAuth第三篇: 对话第四篇: 消息第五篇: 实时消息第六篇: 仅用于开发的登录
现在我们已经完成了后端,让我们转到前端。 我将采用单页应用程序方案。
首先,我们创建一个 static/index.html 文件,内容如下。
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Messenger</title> <link rel="shortcut icon" href="data:,"> <link rel="stylesheet" href="/styles.css"> <script src="/main.js" type="module"></script></head><body></body></html>
这个 HTML 文件必须为每个 URL 提供服务,并且使用 JavaScript 负责呈现正确的页面。
因此,让我们将注意力转到 main.go 片刻,然后在 main() 函数中添加以下路由:
router.Handle("GET", "/...", http.FileServer(SPAFileSystem{http.Dir("static")}))type SPAFileSystem struct { fs http.FileSystem}func (spa SPAFileSystem) Open(name string) (http.File, error) { f, err := spa.fs.Open(name) if err != nil { return spa.fs.Open("index.html") } return f, nil}
我们使用一个自定义的文件系统,因此它不是为未知的 URL 返回 404 Not Found,而是转到 index.html。
路由器
在 index.html 中我们加载了两个文件:styles.css 和 main.js。我把样式留给你自由发挥。
让我们移动到 main.js。 创建一个包含以下内容的 static/main.js 文件:
import { guard } from './auth.js'import Router from './router.js'let currentPageconst disconnect = new CustomEvent('disconnect')const router = new Router()router.handle('/', guard(view('home'), view('access')))router.handle('/callback', view('callback'))router.handle(/^\/conversations\/([^\/]+)$/, guard(view('conversation'), view('access')))router.handle(/^\//, view('not-found'))router.install(async result => { document.body.innerHTML = '' if (currentPage instanceof Node) { currentPage.dispatchEvent(disconnect) } currentPage = await result if (currentPage instanceof Node) { document.body.appendChild(currentPage) }})function view(pageName) { return (...args) => import(`/pages/${pageName}-page.js`) .then(m => m.default(...args))}
如果你是这个博客的关注者,你已经知道它是如何工作的了。 该路由器就是在 这里 显示的那个。 只需从 @nicolasparada/router 下载并保存到 static/router.js 即可。
我们注册了四条路由。 在根路由 / 处,我们展示 home 或 access 页面,无论用户是否通过身份验证。 在 /callback 中,我们展示 callback 页面。 在 /conversations/{conversationID} 上,我们展示对话或 access 页面,无论用户是否通过验证,对于其他 URL,我们展示一个 not-found 页面。
我们告诉路由器将结果渲染为文档主体,并在离开之前向每个页面调度一个 disconnect 事件。
我们将每个页面放在不同的文件中,并使用新的动态 import() 函数导入它们。
身份验证
guard() 是一个函数,给它两个函数作为参数,如果用户通过了身份验证,则执行第一个函数,否则执行第二个。它来自 auth.js,所以我们创建一个包含以下内容的 static/auth.js 文件:
export function isAuthenticated() { const token = localStorage.getItem('token') const expiresAtItem = localStorage.getItem('expires_at') if (token === null || expiresAtItem === null) { return false } const expiresAt = new Date(expiresAtItem) if (isNaN(expiresAt.valueOf()) || expiresAt <= new Date()) { return false } return
以上内容由优质教程资源合作伙伴 “鲸鱼办公” 整理编辑,如果对您有帮助欢迎转发分享!
你可能对这些文章感兴趣:- Excel表格十大函数(Excel表格函数公式出现错误怎么办?)
- 对不起!忘了告诉你如何激活win10LTSC版,比windows7流畅干净
- Mac新手使用技巧——Mac音量调节
- 新入手的iPhone 13,记得提前打开这5个功能,让手机更好用
- iPhone状态栏中怎么显示图标 状态栏爱心等图标设置方法
- iphone应用图标大小要怎么调整?(iPhone应用图标大小)
- 有办法了!批量删除多个Word页眉页脚
- Excel常用函数知识:使用RANK.EQ或RANK.AVG函数进行排名计算
- RANKIF?Excel中有这个函数吗?
- 手机与和U盘的连接及文件操作(手机直接连接u盘为什么不能互传文件)
本文地址:https://logohe.com/478106.html ,如需转载请文章来源:办公资源网
声明:本站所有文章均为网络资源收集于及用户投稿,只做学习和交流使用,版权归原作者所有,请在下载后24小时之内自觉删除。如若本站内容侵犯了原著者的合法权益,请联系站长484405847@qq.com删除,我们将及时处理!