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: "随机图片,点击查看。
右键可复制链接", 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