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
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
|
|
|