Skip to content

功能页配置

私密文章(登录页)v1.3.0

什么是登录页?在导航栏 功能页 -> 登录页 点击查看效果。

您可以通过 teek-login-page 插槽自定义登录页。

使用登录页需要 2 个步骤:

  • 创建一个登录页,如何创建请看 登录页
  • 开启私密文章监听
ts
// .vitepress/config.mts
import { defineTeekConfig } from "vitepress-theme-teek/config";

const teekConfig = defineTeekConfig({
  private: {
    enabled: true,
  },
});

此时已经开启了私密文章功能,下一步您需要配置登录相关的配置,如果要想了解所有配置请看 更多配置项

这里仅仅给出一些配置项例子,有关私密文章更详细的设计、介绍、使用,请看 私密文章

ts
// .vitepress/config.mts
import { defineTeekConfig } from "vitepress-theme-teek/config";

const teekConfig = defineTeekConfig({
  private: {
    enabled: false,
    expire: "1d",
    session: true,
    siteLogin: false,
    site: [
      { username: "teek-site-1", password: "teek", role: "common", expire: "1d", session: true, strategy: "once" },
      { username: "teek-site-2", password: "teek", role: "admin", expire: "1d", session: false, strategy: "always" },
    ],
    pages: [
      { username: "teek-pages-1", password: "teek", expire: "1d", session: true, strategy: "once" },
      { username: "teek-pages-2", password: "teek", expire: "1d", session: false, strategy: "always" },
    ],
    realm: {
      blog: [
        { username: "teek-blog-1", password: "teek", expire: "1d", session: true, strategy: "once" },
        { username: "teek-blog-2", password: "teek", expire: "1d", session: false, strategy: "always" },
      ],
      comment: [
        { username: "teek-comment-1", password: "teek", expire: "1d", session: true, strategy: "always" },
        { username: "teek-comment-2", password: "teek", expire: "1d", session: false, strategy: "always" },
      ],
    },
    // onFocus: (value, formName) => {},
    // onBlur: (value, formName) => {},
    // doLogin: (loginInfo, type, nativeExecLogin) => true,
    // doValidate: (type, frontmatter, nativeExecLogin) => true,
    // encrypt: (value, frontmatter) => value,
    // decrypt: (value, frontmatter) => value,
  },
});
ts
interface Private {
  /**
   * 是否启用私密功能
   *
   * @default false
   */
  enabled?: boolean;
  /**
   * 登录过期时间:1d 代表 1 天,1h 代表 1 小时,仅支持这两个单位,不加单位代表秒。过期后访问私密文章重新输入用户名和密码。默认一天
   *
   * @default '1d'
   */
  expire?: string;
  /**
   * 开启是否在网页关闭或刷新后,清除登录状态,这样再次访问网页,需要重新登录
   *
   * @default false
   */
  session?: boolean;
  /**
   * 是否使用站点级别登录功能,即第一次进入网站需要验证
   *
   * @default false
   */
  siteLogin?: boolean;
  /**
   * 站点级别登录信息,进入站点时需要认证,当 siteLogin 为 true 时生效
   */
  site?: (LoginInfo & { role?: "common" | "admin" })[];
  /**
   * 全局页面级登录信息,登录一次后其他全局页面级别的文章都可以访问
   */
  pages?: LoginInfo[];
  /**
   * 领域页面级别登录信息,登录一次后其他相同领域的文章都可以访问
   */
  realm?: { [key: string]: LoginInfo[] };
  /**
   * 输入框聚焦回调
   */
  onFocus?: (value: string, formName: "username" | "password" | "verifyCode") => void;
  /**
   * 输入框失焦回调
   */
  onBlur?: (value: string, formName: "username" | "password" | "verifyCode") => void;
  /**
   * 自定义登录逻辑,如果返回 boolean 代表自定义逻辑成功或者失败(内部会删除提示语),返回 undefined 代表结束登录逻辑
   *
   * @param nativeExecLogin 内置的登录函数,通过调用该函数来实现内置的登录功能
   */
  doLogin?: (
    loginInfo: { username: string; password: string },
    type: "site" | "pages" | "realm" | "page",
    nativeExecLogin: () => boolean
  ) => boolean | undefined;
  /**
   * 自定义验证逻辑
   *
   * @param nativeExecLogin 内置的登录函数,通过调用该函数来实现内置的登录功能
   */
  doValidate?: (
    type: "site" | "pages" | "realm" | "page",
    frontmatter: Record<string, any>,
    nativeValidate: () => boolean
  ) => boolean;
  /**
   * 自定义加密逻辑
   */
  encrypt?: (value: string, frontmatter: Record<string, any>) => string;
  /**
   * 自定义解密逻辑
   */
  decrypt?: (value: string, frontmatter: Record<string, any>) => string;
}

interface LoginInfo {
  /**
   * 用户名
   */
  username: string;
  /**
   * 密码
   */
  password: string;
  /**
   * 登录过期时间:1d 代表 1 天,1h 代表 1 小时,仅支持这两个单位,不加单位代表秒。过期后访问私密文章重新输入用户名和密码。默认一天
   *
   * @default 1d
   */
  expire?: string;
  /**
   * 开启是否在网页关闭或刷新后,清除登录状态,这样再次访问网页,需要重新登录
   *
   * @default false
   */
  session?: boolean;
  /**
   * 登录策略,once 代表一次登录,always 代表每次访问都登录
   *
   * @default 'once'
   */
  strategy?: "once" | "always";
}

风险链接提示页 v1.3.0

什么是风险链接提示页?在导航栏 功能页 -> 风险链接提示页 点击查看效果。

您可以通过 teek-risk-link-page 插槽自定义险链接提示页。

使用风险链接提示页需要 2 个步骤:

  • 创建一个风险链接提示页,如何创建请看 风险链接提示页
  • 开启监听外部链接跳转拦截功能(监听 a 标签的点击事件)
ts
// .vitepress/config.mts
import { defineTeekConfig } from "vitepress-theme-teek/config";

const teekConfig = defineTeekConfig({
  riskLink: {
    enabled: true,
  },
});
ts
interface RiskLink {
  /**
   * 是否启用风险链接提示功能
   *
   * @default false
   */
  enabled?: boolean;
  /**
   * 白名单,支持正则表达式
   */
  whitelist?: Array<RegExp | string>;
  /**
   * 黑名单,支持正则表达式
   *
   * @remark 如果设置了黑名单,则只拦截黑名单的链接
   */
  blacklist?: Array<RegExp | string>;
}

此时 Teek 会监听所有 a 标签的点击事件,如果点击的链接是风险链接,则会先跳转到风险链接提示页。

什么是风险链接?

Teek 把非本域名下的跳转链接视为风险链接。

如果您需要对一些链接放行或者专门拦截,请使用白名单和黑名单功能。

ts
// .vitepress/config.mts
import { defineTeekConfig } from "vitepress-theme-teek/config";

const teekConfig = defineTeekConfig({
  riskLink: {
    enabled: true,
    whitelist: ["http://vp.teek.top", /https:\/\/github.com/],
    blacklist: [],
  },
});

白名单和黑名单支持字符串和正则表达式:

  • 当为字符串时,Teek 先完全匹配跳转的链接,如果匹配失败,则匹配跳转的链接开头部分(startsWith 方法),因此你可以配置某个域名或者某个完整的链接
  • 当为正则表达式时,按照正则表达式进行匹配跳转的链接

当配置了黑名单,则只拦截黑名单的链接,其他链接全部放行,如果黑名单的链接在白名单里,则也会放行(白名单优先级最高)。

最近更新