You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

188 lines
6.7 KiB

import Router from "utils/router.js"
import UserService from "services/UserService.js"
import SiteConfigService from "services/SiteConfigService.js"
import svgCaptcha from "svg-captcha"
import CommonError from "@/utils/error/CommonError"
class PageController {
constructor() {
this.userService = new UserService()
this.siteConfigService = new SiteConfigService()
}
// 首页
async indexGet(ctx) {
return await ctx.render(
"page/index/index",
{
apiList: [
{
name: "随机图片",
desc: "随机图片,点击查看。<br> 右键可复制链接",
url: "https://pic.xieyaxin.top/random.php",
},
],
blogs: [
{
title: "以梦为马,不负韶华",
content: "生活如诗,岁月如歌。让我们在时光的长河中,保持热爱,奔赴山海,书写属于自己的精彩篇章。",
},
{
title: "风雨过后是彩虹",
content: "以前,我以为自己很坚强,直到有一天,我发现自己连哭都哭不出来。",
},
{
title: "岁月如歌",
content: "未来,我希望能有更多的时间陪伴家人,有更多的时间去旅行,有更多的时间去实现自己的梦想。",
},
{
title: "明月如水",
content: "啊啊"
}
].slice(0, 4),
},
{ includeSite: true, includeUser: true }
)
}
// 未授权报错页
async indexNoAuth(ctx) {
return await ctx.render("page/auth/no-auth", {})
}
// 登录页
async loginGet(ctx) {
if (ctx.session.user) {
ctx.status = 200
ctx.redirect("/?msg=用户已登录")
return
}
return await ctx.render("page/login/index", { site_title: "登录" })
}
// 处理登录请求
async loginPost(ctx) {
const { username, email, password } = ctx.request.body
const result = await this.userService.login({ username, email, password })
ctx.session.user = result.user
ctx.body = { success: true, message: "登录成功" }
}
// 获取验证码
async captchaGet(ctx) {
var captcha = svgCaptcha.create({
size: 4, // 个数
width: 100, // 宽
height: 30, // 高
fontSize: 38, // 字体大小
color: true, // 字体颜色是否多变
noise: 4, // 干扰线几条
})
// 记录验证码信息(文本+过期时间)
// 这里设置5分钟后过期
const expireTime = Date.now() + 5 * 60 * 1000
ctx.session.captcha = {
text: captcha.text.toLowerCase(), // 转小写,忽略大小写验证
expireTime: expireTime,
}
ctx.type = "image/svg+xml"
ctx.body = captcha.data
}
// 注册页
async registerGet(ctx) {
if (ctx.session.user) {
return ctx.redirect("/?msg=用户已登录")
}
// TODO 多个
ctx.session.registerRandomStr = Math.ceil(Math.random() * 100000000000000)
return await ctx.render("page/register/index", { site_title: "注册", randomStr: ctx.session.registerRandomStr })
}
// 处理注册请求
async registerPost(ctx) {
const { username, password, code, randomStr } = ctx.request.body
if (!ctx.session.registerRandomStr) {
throw new CommonError("缺少随机数")
}
if (ctx.session.registerRandomStr + "" !== randomStr + "") {
throw new CommonError("随机数不匹配")
}
delete ctx.session.registerRandomStr
// 检查Session中是否存在验证码
if (!ctx.session.captcha) {
throw new CommonError("验证码不存在,请重新获取")
}
const { text, expireTime } = ctx.session.captcha
// 检查是否过期
if (Date.now() > expireTime) {
// 过期后清除Session中的验证码
delete ctx.session.captcha
throw new CommonError("验证码已过期,请重新获取")
}
if (!code) {
throw new CommonError("请输入验证码")
}
if (code.toLowerCase() !== text) {
throw new CommonError("验证码错误")
}
delete ctx.session.captcha
await this.userService.register({ username, password, role: "user" })
return ctx.redirect("/login")
}
// 退出登录
async logout(ctx) {
ctx.status = 200
delete ctx.session.user
ctx.set("hx-redirect", "/")
}
// 渲染页面
pageGet(name, data) {
return async ctx => {
return await ctx.render(
name,
{
...(data || {}),
},
{ includeSite: true, includeUser: true }
)
}
}
static createRoutes() {
const controller = new PageController()
const router = new Router({ auth: "try" })
// 首页
router.get("/", controller.indexGet.bind(controller), { auth: false })
// 未授权报错页
router.get("/no-auth", controller.indexNoAuth.bind(controller), { auth: false })
router.get("/article/:id", controller.pageGet("page/articles/index"), { auth: false })
router.get("/articles", controller.pageGet("page/articles/index"), { auth: false })
router.get("/about", controller.pageGet("page/about/index"), { auth: false })
router.get("/terms", controller.pageGet("page/index/terms"), { auth: false })
router.get("/privacy", controller.pageGet("page/index/privacy"), { auth: false })
router.get("/faq", controller.pageGet("page/index/faq"), { auth: false })
// router.get("/feedback", controller.pageGet("page/index/feedback"), { auth: false })
router.get("/login", controller.loginGet.bind(controller), { auth: "try" })
router.post("/login", controller.loginPost.bind(controller), { auth: false })
router.get("/captcha", controller.captchaGet.bind(controller), { auth: false })
router.get("/register", controller.registerGet.bind(controller), { auth: "try" })
router.post("/register", controller.registerPost.bind(controller), { auth: false })
router.post("/logout", controller.logout.bind(controller), { auth: true })
return router
}
}
export default PageController