You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NextJS与Strapi的图书借阅应用技术问题咨询

解决方案:Next.js + Strapi 图书借阅应用问题

1. 基于用户身份获取专属数据的实现方式

认证流程

Strapi自带JWT认证系统,前端可以通过以下步骤实现用户认证:

  • 登录:向Strapi的/api/auth/local接口POST用户名密码,获取返回的jwt令牌,存储在localStorage(客户端)或Cookie(服务端渲染场景更安全)中。
  • 请求拦截:后续所有需要用户权限的API请求,在请求头带上Authorization: Bearer <jwt令牌>,Strapi会自动验证并将当前用户信息注入ctx.state.user。

按用户过滤数据

在Strapi中自定义内容类型的控制器,通过当前用户ID过滤数据:

// src/api/user-details/controllers/user-details.js
module.exports = {
  async find(ctx) {
    // 未认证用户直接返回无权限
    if (!ctx.state.user) return ctx.unauthorized();
    
    // 仅返回当前用户的专属数据
    return await strapi.db.query('api::user-details.user-details').findOne({
      where: { user: ctx.state.user.id },
      populate: ['received_books', 'sent_books'] // 关联组件字段
    });
  },
};

前端Next.js请求示例:

import axios from 'axios';

const fetchUserBooks = async () => {
  const token = localStorage.getItem('strapiToken');
  const res = await axios.get('/api/user-details', {
    headers: { Authorization: `Bearer ${token}` }
  });
  return res.data;
};

2. 通过API访问和修改内容类型组件

Strapi的组件是嵌套在内容类型中的,修改组件数据直接通过更新对应内容类型的API完成:

添加组件项目示例

假设user_details的received_books是重复组件,前端通过PUT请求添加新图书:

const addReceivedBook = async (newBook) => {
  const token = localStorage.getItem('strapiToken');
  const userDetailsId = '当前用户的user_details ID'; // 从之前的查询结果中获取
  
  await axios.put(`/api/user-details/${userDetailsId}`, {
    data: {
      received_books: [
        ...existingReceivedBooks, // 保留原有组件数据
        {
          book_title: newBook.title,
          author: newBook.author,
          borrow_date: new Date().toISOString()
          // 组件定义的其他字段
        }
      ]
    }
  }, {
    headers: { Authorization: `Bearer ${token}` }
  });
};

注意:需在Strapi后台给user-details内容类型的update权限开放给认证用户,否则请求会被拦截。

3. 在user_details中添加「已接收/已发送」图书组件的合理性

这种实现方式在小型应用中是可行的,但要根据扩展性需求判断:

  • 适合场景:图书仅作为用户的借阅记录,不需要单独维护图书的公共信息(如库存、分类),组件结构紧凑,开发成本低。
  • 更优方案:如果需要独立管理图书数据(比如支持图书搜索、全局库存统计),建议拆分出Book独立内容类型,通过关联关系(如user_details与Book建立双向关联,新增borrow_status字段区分借出/借入)替代组件。关联关系的优势是数据可复用、查询更灵活,便于后续功能扩展。

内容的提问来源于stack exchange,提问作者th-mhmn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:01:14