IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 搭建个人知识付费应用系统-(6)Sanity 集成 -> 正文阅读

[JavaScript知识库]搭建个人知识付费应用系统-(6)Sanity 集成

视频地址:https://www.bilibili.com/video/BV1qY4y1K7AH/

Sanity 建模

官网及文档: https://www.sanity.io/

# 起 Sanity 服务
yarn add sanity@dev-preview sanity-plugin-markdown@studio-v3

# 客户端调用
yarn add @sanity/client

创建一个 Sanity 配置文件 sanity.config.ts

import { createConfig } from 'sanity';
import { deskTool } from 'sanity/desk';
import { markdownSchema } from 'sanity-plugin-markdown';

export default createConfig({
  name: 'default',
  title: 'willin.wang',

  projectId: 'crrougir',
  dataset: 'production',

  plugins: [deskTool(), markdownSchema()],

  schema: {
    types: [
      {
        title: 'Post',
        name: 'post',
        type: 'document',
        fields: [
          {
            name: 'title',
            title: 'Title',
            type: 'string'
          },
          {
            name: 'slug',
            title: 'Slug',
            type: 'slug',
            options: {
              source: 'title'
            }
          },
          {
            name: 'content',
            title: 'Content',
            type: 'markdown'
          },
          {
            name: 'excerpt',
            title: 'Excerpt',
            type: 'string'
          },
          {
            title: 'Tags',
            name: 'tags',
            type: 'array',
            of: [
              {
                type: 'reference',
                to: [{ type: 'tag' }]
              }
            ]
          },
          {
            name: 'lang',
            title: 'Language',
            type: 'string',
            initialValue: 'zhCN'
          }
        ]
      },
      {
        name: 'tag',
        title: 'Tag',
        type: 'document',
        fields: [
          {
            name: 'name',
            title: 'Name',
            type: 'object',
            fields: [
              {
                name: 'zhCN',
                title: '简体中文',
                type: 'string'
              },
              {
                name: 'enUS',
                title: 'English',
                type: 'string'
              }
            ]
          },
          {
            name: 'slug',
            title: 'Slug',
            type: 'slug',
            options: {
              source: 'title'
            }
          }
        ]
      }
    ]
  }
});

该配置文件包含:

  • 文章类型申明
  • 标签类型申明

后续还需要根据文章类型再加上:页面、文章、代码片段的区分(做视频的时候忘了)。

本地启动 sanity 服务:

npx sanity start

然后访问: http://localhost:3333 登录并管理内容。

Sanity 客户端调用封装

import createClient from '@sanity/client';

const sanityConfig = {
  projectId: process.env.SANITY_PROJECT_ID || 'crrougir',
  dataset: process.env.SANITY_DATASET || 'production',
  useCdn: process.env.NODE_ENV !== 'production',
  apiVersion: '2021-03-25'
};

export const sanityClient = createClient(sanityConfig);

export const previewClient = createClient({
  ...sanityConfig,
  useCdn: false,
  token: process.env.SANITY_API_TOKEN
});

export const getClient = (preview) => (preview ? previewClient : sanityClient);

因为默认允许有两个 dataset,其中一个为 Production,所以可以使用 previewClient 来访问开发环境。

Sanity 查询

GROQ 查询语言: https://www.sanity.io/docs/groq

需要好好看看,折腾了半天没太搞明白。好不容易凑了一个例子跑对了。

const postFields = `
  _id,
  title,
  excerpt,
  lang,
  tags[]->{
    name,
    "slug": slug.current
  },
  "slug": slug.current,
`;

export const postQuery = `
{
  "post": *[_type == "post" && slug.current == $slug] | order(_updatedAt desc) [0] {
    content,
    ${postFields}
  }
}`;

注意 tags 那里,折腾了好久。

写一个测试接口:

import { json } from '@remix-run/node';
import { postQuery } from '~/lib/query';
import { getClient } from '~/lib/sanity';

export const loader = async () => {
  const data = await getClient().fetch(postQuery, { slug: 'test' });

  return json(data);
};
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:54:55  更:2022-09-15 01:56:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:12:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码